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

2021-08-05 19:57:14 字數 1872 閱讀 2726

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

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

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

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

桶排序的思想:對映函式

動態示意圖:

顯然,桶內排序是桶排序效能好壞的決定因素。

(2)盡量的增大桶的數量。極限情況下每個桶只能得到乙個資料,避開桶內資料的「比較」排序操作

桶數量越多,意味著空間浪費越大,所以在時間和空間複雜度之間需要做出權衡

最優時間複雜度:o(n)

平均時間複雜度:o(n + c)

計數排序桶排序比較:

基數排序桶排序的比較:

但是,對比桶排序,基數排序每次需要的桶的數量並不多。而且基數排序幾乎不需要任何「比較」操作,而桶排序在桶相對較少的情況下,桶內多個資料必須進行基於比較操作的排序。因此,在實際應用中基數排序的應用範圍更加廣泛。

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

功能:桶排序

引數: pos:第pos位

n:陣列元素個數

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

#include

#include

#include

#define n 10 //陣列元素個數

struct barrel

;

/* 輸出函式 */

void printarr(int arr,int n)

/* 直接插入排序 */

void insertionsort(int

array, int count)

array[j] = temp;}}

/* 桶排序函式 */

void bucketsort(int data, int n)

else

if (data[i] < min)

}

bucket_num = (max - min + 1) / 10 + 1;

//桶空間分配即初始化

pbarrel = (struct barrel*)malloc(sizeof(struct barrel) * bucket_num);

memset(pbarrel, 0, sizeof(struct barrel) * bucket_num);

//陣列元素放入桶內

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

//桶內排序

pos = 0;

for (i = 0; i < bucket_num; i++)

}

free(pbarrel);

}

int main()

, i;

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

//函式呼叫

bucketsort(data, n);

//輸出

printarr(data, n);

return

0; }

注:

acknowledgements:

推薦,桶排序的應用例項)

2017.08.09

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

排序演算法 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...