第1節、一個蘿蔔一個坑——計數排序

無處不在的排序

上學時考試成績從高到低排序,前幾名會得到小花花;
淘寶剁手時,銷量從高到低排序,買銷量高的,羣衆的眼睛是雪亮的,你們的選擇總沒錯,或者價格從低到高排序,便宜纔是硬到底!
Windows系統和OS系統文件按照文件名稱、時間排序一樣離不開!
排對對,分果果算法

一、栗子

期末成績出來了,大白考了第4名,得了6 分,總分10分,回家媽媽打他了一頓:你看鄰居家的孩子考得多好呀!
第四名
家長會上,老師要求你們成績從低到高排序,前三名獎勵小紅花,你們如何排隊呢?數組

二、準備工做

一個蘿蔔一個坑,首先要準備不少個坑,以後把對應的蘿蔔放進去,以後數一下那個坑裏有蘿蔔就OK了!大數據

咱們可使用一個一維數組解決這個問題。優化

數組的長度爲分數的範圍,這裏就是從0到10,等看完了就知道爲何要這樣了。spa

首先申請一個長度爲11的數組a[11],數據範圍爲a[0]~a[10],將數組所有初始化爲0,表示這裏沒有人得過。code

int a[11]={0};

開始讀取每一個人的分數(6,9,8,7,5),第一我的的分數爲6,將a[6]設置爲1,表示有一我的得了6分,同理將a[9]設置爲1,表示有一我的得了9分……其餘同理排序

每一個人的分數處理完成以後,遍歷下這個數組,若是數據a[i]爲0,表示沒有人得i分,否定就有,輸出i就能夠了。rem

三、代碼

這裏是完整代碼,使用C語言get

//輸入:6 9 8 7 5
//輸出:9 8 7 6 5
#include <stdio.h> 
int main()
{
    int a[11], i, j, t;
    //數組初始化爲0
    for (i = 0;i <= 10;i++)
        a[i] = 0; 

    //計數排序,計算每一個數出現的次數,以後排序
    for (i = 1;i <= 5;i++)
    {
        scanf("%d", &t);
        a[t]++; 
    }

    //輸出結果
    for (i = 0;i <= 10;i++)
        for (j = 1;j <= a[i];j++)
            printf("%d ", i);
    
    //等待輸入,避免最終結果一閃而過
    getchar();getchar();
    return 0;
}

四、優化

該算法於1954年由 Harold H. Seward 提出,距今已經N多年了,時間上只須要對數組進行一次遍歷,複雜度O(n),時間表現很優秀;it

空間上須要分配0~最大數據的空間,若是輸入數據爲(1,2,3,10000),只有4個數,卻要分配a[10001],這麼多的空間!

計數排序就是用空間換時間!大量的空間佔用固然就存在優化的空間!

相關文章
相關標籤/搜索