資料結構之計數排序
1 計數排序
計數排序是一種比較快速的排序方法,相對於氣泡排序、快速排序、堆排序、雞尾酒排序等,計數排序是一種不需要進行元素之間對比的排序演算法,但是該演算法也有一定的侷限性。
演算法思路:
需要使用一個計數陣列,將待排序陣列中的每個元素遍歷一遍,將每個元素出現的個數放到計數陣列中,元素的值是多少就在計數陣列相應的下標元素上的計數加1。舉例:
待排序陣列:[2,4,3,2,2,2,5,5,6,2,9,8,8,9]
通過計算,可以知道當前陣列的最大值是9
,所以建立一個大小為9+1
的陣列,然後遍歷該陣列,並記錄每個元素出現的次數,計數陣列如下:
[0, 0, 5, 1, 1, 2, 1, 0, 2, 2]
然後,按順序遍歷該計數陣列即可,陣列中元素的值代表以該下標為值的元素在陣列中出現的次數。結果如下:
升序排序:[2, 2, 2, 2, 2, 3, 4, 5, 5, 6, 8, 8, 8, 9]
2 樸素版計數排序程式碼
public class CountSort {
private int[] array;
public CountSort(int[] array) {
this.array = array;
}
public void increaseSortOrigin(){
int n = this.array.length;
int max = this.array[0];
for (int i = 1; i < n; i++) {
if (this.array[i]>max)
max=this.array[i];
}
int [] countArray = new int[max+1];
for (int i = 0; i < n; i++) {
countArray[this.array[i]] ++;
}
System.out.println(Arrays.toString(countArray));
int c=0;
for (int i = 0; i < max; i++) {
for (int j = 0; j < countArray[i]; j++) {
this.array[c] = i;
c++;
}
}
}
}
3 優化版計數排序
當待排序陣列中的最大值很大時,那麼可能會浪費很多空間,因為需要建立一個空間很大的計數陣列來存放計數,且此時元素有不多的話,那浪費將更加嚴重。那麼如何對其進行優化呢,可以使用一個最大和最小值,使用相對值來存放計數。
如下面的陣列:
[92,94,93,92,92,92,95,95,96,92,99,98,98,99],如果按照上面的思路可能需要一個陣列空間為99
的計數陣列,但是元素的值主要集中在90-100
之間,那麼前面90個空間就浪費了。所以使用相對位置進行計數。讓陣列中每一個元素減去陣列中的最小元素的值,當對計數陣列進行還原時,再加上最小值進行還原。使用相對計數的話,可以看到計數陣列的空間就小很多。
public class CountSort {
private int[] array;
public CountSort(int[] array) {
this.array = array;
}
public void increaseSort(){
int n = this.array.length;
int max = this.array[0];
int min = this.array[0];
for (int i = 1; i < n; i++) {
if (this.array[i] > max)
max = this.array[i];
if (this.array[i] < min)
min= this.array[i];
}
int [] countArray = new int[max-min+1];
for (int i = 0; i < n; i++) {
countArray[this.array[i]-min] ++;
}
System.out.println(Arrays.toString(countArray));
int c = 0;
for (int i = 0; i < max-min+1; i++) {
for (int j = 0; j < countArray[i]; j++) {
this.array[c] = i+min;
c++;
}
}
}
}
4 演算法複雜度分析
4.1 時間複雜度
由於計數排序使用使用一個計數陣列進行緩衝,且計數陣列的大小為max-min=m
,原始陣列的大小為n
,從演算法中可以看到,需要對原陣列資料進行3次遍歷,對計數資料進行1次遍歷,所以空間複雜度為3n+m
->O(n+m)
4.2 空間複雜度
如果不考慮原陣列的大小的話,只考慮額外的開銷,那麼該演算法的空間複雜度為O(m)
。
相關文章
- (戀上資料結構筆記):計數排序、基數排序 、桶排序資料結構筆記排序
- 【資料結構與演算法】非比較排序(計數排序、桶排序、基數排序)資料結構演算法排序
- 資料結構與演算法之排序資料結構演算法排序
- 資料結構與排序資料結構排序
- 資料結構與演算法之快速排序資料結構演算法排序
- 對資料結構和演算法的總結和思考(六)--計數排序資料結構演算法排序
- 資料結構與演算法——排序演算法-基數排序資料結構演算法排序
- 演算法與資料結構之原地堆排序演算法資料結構排序
- 私人訂製之資料結構(排序演算法)資料結構排序演算法
- 資料結構之堆 → 不要侷限於堆排序資料結構排序
- 04資料結構排序演算法之直接插入排序資料結構排序演算法
- Redis資料結構之整數集合Redis資料結構
- 資料結構java版之氣泡排序及優化資料結構Java排序優化
- Java排序之計數排序Java排序
- 資料結構32:選擇排序資料結構排序
- 資料結構第10章 排序資料結構排序
- 資料結構(python) —— 【18排序: 桶排序】資料結構Python排序
- JavaScript資料結構之連結串列--設計JavaScript資料結構
- 資料結構小白系列之資料結構概述資料結構
- 演算法與資料結構高階排序演算法之歸併排序演算法資料結構排序
- 資料結構--排序--插入排序--python語言描述資料結構排序Python
- 資料結構與演算法——排序資料結構演算法排序
- 資料結構第九節(排序(上))資料結構排序
- Java 程式設計技巧之資料結構Java程式設計資料結構
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- SpringCloud大型企業分散式微服務雲架構原始碼之【資料結構】-排序-希爾排序SpringGCCloud分散式微服務架構原始碼資料結構排序
- 資料結構和演算法面試題系列—排序演算法之快速排序資料結構演算法面試題排序
- Java 資料結構與演算法系列之氣泡排序Java資料結構演算法排序
- 07 Javascript資料結構與演算法 之 排序演算法JavaScript資料結構演算法排序
- 資料結構之「棧」資料結構
- 資料結構之棧資料結構
- 資料結構之圖資料結構
- 資料結構之——棧資料結構
- 資料結構之「樹」資料結構
- 資料結構學習之樹結構資料結構
- 資料結構與演算法(八):排序資料結構演算法排序
- 資料結構與演算法:堆排序資料結構演算法排序
- 資料結構:歸併排序(非遞迴)資料結構排序遞迴