核心思想:通過計算某個資料之前有多少個資料來確定自身的位置,不通過資料之間的相互比較,所以是非比較排序。
原始計數排序:
時間複雜度:o(n+k)k為資料量
缺點:如果資料只有兩個,9999,10000,那麼會額外建立容量為10000的陣列,浪費空間。
public static int countsort1(int array)
}//2.根據數列的最大值確定統計陣列的長度
int coutarray = new int[max + 1];
//3.遍歷數列,填充統計陣列
for (int i = 0; i < array.length; i++)
//4.遍歷統計陣列,輸出結果
int index = 0;
int sortedarray = new int[array.length];
for (int i = 0; i < coutarray.length; i++)
}return sortedarray;
}
改進之後:只會建立最大值減去最小值長度的陣列,節省空間,但只適合資料均勻分布的資料,比如,如果資料是1,10000,仍然會建立容量為10000的資料。
public static int countsort(int array)
if (array[i] < min)
}int d = max - min;
//2.建立統計陣列並計算統計對應元素個數,countarray出儲存的值是array中資料出現的次數;countarray下標代表的意思是arry中資料排好序的相對位置
// 比如陣列array:95,96,95,99,100,99。,則對應陣列countarray,countarray[0]=2;代表95出現了兩次,,countarray[1]=1;代表96出現了1次
// ,countarray[2]=2,代表99出現了2次,countarray[3]=1,代表100出現了1次,
int countarray = new int[d + 1];
for (int i = 0; i < array.length; i++)
//3.統計陣列變形,後面的元素等於前面的元素之和
int sum = 0;
for (int i = 0; i < countarray.length; i++)
//4.倒序遍歷原始陣列,從統計陣列找到正確位置,輸出到結果陣列
int sortedarray = new int[array.length];
for (int i = array.length - 1; i >= 0; i--)
return sortedarray;
}
演算法之計數排序
原理 用乙個陣列記錄待排序陣列 現的數字。最低位代表最小值,偏移量是記錄陣列中的下標 待排序陣列 2 1 4 可以表示為 記錄陣列 1 1 0 1 陣列長度為 4 1 1 然後根據記錄陣列輸出結果 public static void countsort int arr if arr.length ...
排序演算法之計數排序
今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...
演算法 排序之計數排序
最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...