上學時考試成績從高到低排序,前幾名會得到小花花;
淘寶剁手時,銷量從高到低排序,買銷量高的,羣衆的眼睛是雪亮的,你們的選擇總沒錯,或者價格從低到高排序,便宜纔是硬到底!
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],這麼多的空間!
計數排序就是用空間換時間!大量的空間佔用固然就存在優化的空間!