演算法與資料結構 常用排序演算法總結2 計數排序

2021-08-05 18:35:15 字數 2075 閱讀 1519

排序演算法大體可分為兩種:

比較排序:氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等

非比較排序:基數排序,計數排序,桶排序等

本文介紹非比較排序演算法中的計數排序演算法。

陣列c的第i個元素取值是陣列a的元素i的個數。

動態示意圖:

要點:步驟:

(2) 統計陣列a中取值為i的元素出現次數,計入陣列c的第i個元素

(3) 陣列c計數累加

(4) 反向填充排序後陣列b

時間複雜度分析:最差/最好/平均時間複雜度均為 o(n + k) = o(n)

遠快於所有基於比較的其他排序演算法

空間複雜度分析:o(n + k) = o(n)

注:計數排序只能對整數進行排序。

典型應用:某地區年齡排序問題。(年齡區間較小)

/********* 函式說明 **********

//引數:

array:待排序陣列

n:陣列元素個數

k:陣列取值最大值 + 1

返回值:成功返回0,失敗返回-1

****************************/

#include

#include

#include

int countingsort(int *array, int n, int k)

/* 陣列賦值 */

memcpy(array, temp, sizeof(int) * n);

free(countarray);

free(temp);

return0;}

int main()

; int max = a[0];

for (int i = 1; i < 8; i++)

//函式呼叫

countingsort(a, 8, max + 1);

//陣列輸出

for (int j = 0; j < 8; j++)

printf("\n");

}

#include 

#include

// 平均時間複雜度 ---- o(n + k)

// 最差時間複雜度 ---- o(n + k)

// 最優時間複雜度 ---- o(n + k)

// 所需輔助空間 ------ o(n + k)

const

int k = 100; //基數,排序[0-99]內的整數

int c[k]; //計數陣列

void countingsort(int a, int n)

/* 計數累加:c[i]儲存著小於等於i的元素個數 */

for (int i = 1; i < k; i++)

/* 排序後陣列空間申請 */

int *b = (int *)malloc(n * sizeof(int));

/* 從後向前掃瞄賦值,保證計數排序的穩定性 */

for (int i = n - 1; i >= 0; i--)

/* 將臨時空間b中的資料拷貝回來 */

for (int i = 0; i < n; i++)

free(b);

}int main()

; //適用場景:每乙個元素都在[0,100]內且有重複元素

int n = sizeof(a) / sizeof(int);

/* 函式呼叫 */

countingsort(a, n);

/* 輸出排序結果 */

printf("計數排序結果:");

for (int i = 0; i < n; i++)

printf("\n");

return

0;}

acknowledgements:

推薦)2017.08.05

資料結構與演算法 排序演算法總結

排序演算法 1 冒泡 對資料的有序性 敏感,一旦排序完成就會 立刻停止,如果待排序的資料是基本有序的,他的排序效率是非常高的。也是實現最簡單的排序,不易出錯,安全性高。2 插入 在已經有序的資料中,新增新的資料,對這個組資料再進行排序比較適合插入排序。3 選擇 是氣泡排序的變種,不是正統的排序方法,...

資料結構與演算法 排序演算法總結

前言 這是我考研時根據率輝老師的 高分筆記 總結的。名稱 空間複雜度 最好情況下時間複雜度 最差情況下時間複雜度 穩定性直接插入排序 o 1 已經有序,雙層迴圈變為單層,o n o n2 穩定希爾排序 o 1 無o n2 不穩定氣泡排序 o n 已經有序,o n o n2 穩定快速排序 o log2...

演算法與資料結構 常用排序演算法總結2 桶排序

排序演算法大體可分為兩種 比較排序 氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等 非比較排序 基數排序,計數排序,桶排序等本文介紹非比較排序演算法中的桶排序演算法。桶排序的思想 對映函式。動態示意圖 顯然,桶內排序是桶排序效能好壞的決定因素。2 盡量的增大桶的數量。極限情況下每個桶只能...