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

2021-08-05 18:58:05 字數 2502 閱讀 1290

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

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

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

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

步驟:演算法主要分為兩個過程,分配+收集

收集:再將0~9號桶中的資料按順序(公升序或降序)放到陣列中

重複分配和收集過程,從個位到最高位,直到排好序為止

注:為何這樣就能完成排序?

答:假設高位相同,次高位已按順序排好,因此保證了順序。

要點分配

收集時間複雜度分析:

最好情況:o(d(n + r))

最壞情況:o(d(n + r))

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

評價:

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

* 引數:

r:基數,比如r = 10表示十進位制劃分,即表示0~9的序列

d:位數,十進位制時即digit有多少位

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

#include

#include //for malloc()

#include //for memset()

/* 獲取乙個十進位制數的第pos位 */

int getposinnum(int num, int pos)

/* 基數排序 */

int radixsort(int *array, int n, int r, int d)

//位比較排序

for (int pos = 0; pos < d; pos++)

//收集過程:從r個空間取數

for (int k = 0, cnt = 0; k < r; k++)

radixarray[k][0] = 0; //復位用於重新計數}}

return0;}

int main()

; //函式呼叫

int r = 10, d = 10; //基數為10,位數為10

radixsort(a, 9, r, d);

//陣列輸出

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

printf("\n");

}

在基數排序中使用了計數排序,計數排序詳見我的另一篇部落格:

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

功能:使用計數排序實現基數排序

引數: pos:第pos位

n:陣列元素個數

d:計數陣列需要使用的陣列元素最大數值

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

#include

#include

#include

const

int d = 3; //待排序的元素為三位數及以下

const

int r = 10; //基數為10,每一位的數字都是[0,9]內的整數

/* 獲取元素的第pos位數字 */

int getdigit(int ele, int pos)

/* 計數排序:對陣列元素的第pos位構成的陣列進行計數排序 */

void countingsort(int a, int n, int pos)

//統計第pos位構成的陣列各個元素出現次數

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

//計數累加

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

//暫存陣列賦值:從後往前賦值,保證排序穩定性

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

memset(temp, 0, n);

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

//陣列賦值

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

free(temp);

}/* 最低位優先基數排序 */

void radixsort(int a, int n)

int main()

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

//函式呼叫,結果輸出

radixsort(a, n);

printf("排序結果:");

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

printf("\n");

return

0;}

acknowledgements:

推薦)2017.08.06

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

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

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

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

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

排序演算法大體可分為兩種 比較排序 氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等 非比較排序 基數排序,計數排序,桶排序等本文介紹非比較排序演算法中的計數排序演算法。陣列c的第i個元素取值是陣列a的元素i的個數。動態示意圖 要點 步驟 2 統計陣列a中取值為i的元素出現次數,計入陣列c...