桶排序和計數排序
桶排序
(bucket sort)
或所謂的
箱排序,是乙個
排序演算法
,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序(有可能再使用別的
排序演算法
或是以遞迴方式繼續使用桶排序進行排序)。桶排序是
鴿巢排序
的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(θ(
n))。但桶排序並不是
比較排序
,他不受到 o(n log n) 下限的影響。
計數排序
(counting sort)
是一種穩定的
排序演算法
。計數排序使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值等於i的元素的個數。然後根據陣列c來將a中的元素排到正確的位置。
當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 θ(n + k)。計數排序不是比較排序,排序的速度快於任何比較排序演算法。
由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍(等於待排序陣列的最大值與最小值的差加上1),這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如:計數排序是用來排序0到100之間的數字的最好的演算法,但是它不適合按字母順序排序人名。但是,計數排序可以用在基數排序中的演算法來排序資料範圍很大的陣列。
源**範例:
#include using namespace std;
/*------桶排序-------
以下列程式進行:
設定乙個定量的陣列當作空桶子。
尋訪序列,並且把專案乙個乙個放到對應的桶子去。
對每個不是空的桶子進行--(插入)排序--。
從不是空的桶子裡把專案再放回原來的序列中。
適用於位數相同,均勻分布的數列
尤其例如:
13,52,16,31,64,16,24,34,82,67,43,56,68,46,90,84,98,26
*/#define radix 10
#define interval 10
struct bucket
};void bucketsort(int a,int len)
newnode=new bucket;
newnode->key=a[i];
newnode->next=temp;
parent->next=newnode;
cout<<"--3--a[i]:"key 因為temp即使沒有資料,其也不為空
}}/*
----------計數排序------------
演算法的步驟如下:
找出待排序的陣列中最大和最小的元素
統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項
對所有的計數累加(從c中的第乙個元素開始,每一項和前一項相加)
反向填充目標陣列:將每個元素i放在新陣列的第c(i)項,每放乙個元素就將c(i)減去1
計數排序是用來排序0到100之間的數字的最好的演算法,但是它不適合按字母順序排序人名。
但是,計數排序可以用在 基數排序 中的演算法來排序資料範圍很大的陣列。
*/void counting_sort(int a,int len)
int size=max-min+1;
int *temp=(int *)malloc(sizeof(int)*size);
memset(temp,0,sizeof(int)*size);
for(i=0;i0) }
int main()
; int a=;
int i;
int len=sizeof(a)/sizeof(int); //在這裡 sizeof(array)=80
//bucketsort(a,len);
counting_sort(a,len);
for(i=0;i
排序演算法 桶排序和計數排序
桶排序 bucket sort 或所謂的箱排序,也是一種排序演算法。其工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序...
計數排序 桶排序和基數排序
當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的差加上1 這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如 計數排...
計數排序 桶排序和基數排序
當輸入的元素是 n 個 0 到 k 之間的整數時,它的執行時間是 n k 計數排序不是比較排序,排序的速度快於任何比較排序演算法。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍 等於待排序陣列的最大值與最小值的差加上1 這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如 計數排...