C++如何過載建構函式
阿新 • • 發佈:2020-12-11
計數排序是一種適合於對陣列中最大值與最小值相差不大的陣列進行排序。
假設對陣列 [1, 0, 5, 6, 4, 7, 4, 2, 8, 9, 0, 1, 4, 2, 0, 3, 5, 7, 8, 6] 進行計數排序。我們可以建立一個臨時陣列a[max+1],臨時陣列的大小為10,臨時陣列的下標正好與原陣列中的資料對應。我們可以遍歷原陣列,每遍歷一個數,對應臨時陣列的下標元素就加一。
比如無序陣列的第一個數是1,那麼臨時陣列下標為1的元素就加一:
第二個數是0,那麼臨時陣列下標為0的元素加一:
直到未排序陣列中的所有資料都遍歷完成,此時臨時陣列的狀態為:
此時,直接遍歷臨時陣列,輸出臨時陣列的下標,元素的值是幾,就輸出幾次,排序就完成了。
程式碼實現
public void countSortE(int[] arr) {
if (arr == null || arr.length < 2) return;
// 找到最大值
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) max = arr[i];
}
// 定義臨時陣列
int[] temp = new int [max + 1];
// 統計每個元素出現的次數
for (int i = 0; i < arr.length; i++) {
temp[arr[i]]++;
}
int k = 0;
// 將臨時陣列統計好的資料彙總到原陣列
for (int i = 0; i < temp.length; i++) {
for (int j = temp[i]; j > 0; j--) {
arr[k++] = i;
}
}
}
優化
前面的程式碼中,我們是根據max的大小來建立臨時陣列,假設原陣列的最大值為10005,最小值為10000,那這樣建立就不合理,所以可以根據最大值與最小值的差值來建立臨時陣列。
優化後的程式碼
public void countSort(int[] arr) {
if (arr == null || arr.length < 2) return;
// 找到陣列的最大最小值
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) max = arr[i];
if (arr[i] < min) min = arr[i];
}
// 定義臨時陣列
int[] temp = new int[max - min + 1];
// 統計每個元素出現的次數
for (int i = 0; i < arr.length; i++) {
temp[arr[i] - min]++;
}
int k = 0;
// 將臨時陣列統計好的資料彙總到原陣列
for (int i = 0; i < temp.length; i++) {
for (int j = temp[i]; j > 0; j--) {
arr[k++] = i + min;
}
}
}
性質
1.時間複雜度:O(n+k) 2.空間複雜度:O(k) 3.穩定排序 4.非原地排序
注:k為臨時陣列的大小