思想:用乙個例子來說明計數排序的思想,對n個50-59之間的整數進行排序,n可能很大。雖然資料量很大,但是取值範圍卻很小,我們可以利用乙個陣列a[10],a[0].....a[9]對應50....59,也就是說,資料減去50作為陣列的下標,例如56,那麼對應的下標就是56-50=6,那麼a[6]執行一次加1操作,代表出現了56這個數,對陣列中的所有元素都是乙個道理,最終a[0]的數值就是原陣列中50的個數,同理a[1]...a[9]。最後遍歷a[10]陣列,輸出相應的值即可。**如下。
int *sort(int arr,int len)
; for(int i=0;i0)
result[j++] = i+50;
}return result;
}
可以仔細的想一想,計數排序不是一種比較的排序,且最終的結果無法表現其穩定性。很難說是穩定的。那麼怎麼改進,可以確保排序後的順序是穩定的呢?我們稱上述的a[10]陣列為統計陣列。可以改進統計陣列,將統計陣列的每一項改進成前一項加本項,表示的含義是統計陣列的元素值代表的是在原陣列中比其對應值小或等於的個數,這話有點繞,仔細想下。舉個例子。
原陣列: 0 1 3 2 3 4 4 5
原統計陣列: 1 1 1 2 2 1 分別代表0、1、2、3、4、5出現的個數
改進的統計陣列: 1 2 3 5 7 8 分別代表小於等於0、1、2、3、4、5的個數
最後倒序遍歷原陣列,第乙個是5,那麼改進後統計陣列下標為5-0的位置處的值,就代表5在排序後的陣列中的位置,也即 8.(是第8個位置,下標為7,寫**時要注意)
第二個被遍歷到的是4,那麼改進後統計陣列下標為4-0位置的值,代表4在排序後陣列中的位置,即 7,注意,此時要將改進後統計陣列下標為4處的值減1,這樣當遍歷到第二個4的時候,其在排序後陣列中的位置就變為了6。這樣就保證了兩個4在原陣列中的位置和在排序後陣列中的相對位置是一樣的。從而是穩定的,接下來的兩個3同理。
**如下:
//通用解法
int *sort(int arr,int len)
if(max < arr[i])
}int *result = new int[len];
int *helparr = new int[max-min+1];
//求解統計陣列
for(int i=0;i=0;--i)
return result;
}
最後的分析:
1)計數排序是非比較的排序演算法
2)適用於資料量大但是取值範圍小的情況
3)可以穩定
4)是這一種以犧牲空間複雜度換取時間複雜度的演算法
十大簡單排序 快速排序
思想 選定乙個元素做中軸,一般是陣列最後乙個元素,從兩頭遍歷陣列,左邊比中軸大的元素和右邊小於等於中軸的元素對換,當左游標大於等於右游標的時候,左游標處的值一定是大於中軸值的,將左游標處的值與末尾的中軸值交換,就完成了第一次的分割,接下來,對中軸兩邊的陣列段再次進行上述相同的處理。最終就得到了排序好...
三大簡單排序
氣泡排序 一 概念及實現 氣泡排序的原理 重複的遍歷要排序的陣列,每次遍歷過程中從頭至尾比較兩個相鄰的元素,若順序錯誤則交換兩個元素。具體如下 實現為公升序 設陣列為a 0 n 1.從頭至尾比較相鄰的元素。如果第乙個元素比第二個元素大,就交換。2.重複步驟1,每次遍歷都將冒出乙個最大數,直到排序完成...
十大經典排序演算法 計數排序 桶排序 基數排序
def count sort arr,maxvalue bucketlen maxvalue 1 bucket 0 bucketlen 建立統計陣列 選擇乙個最大的數 max arr max arr 建立乙個元素全是0的列表,當做桶 bucket 0 max arr 1 把所有元素放入桶中,即把對應...