排序演算法 分配排序 C 實現

2021-06-12 23:53:26 字數 2414 閱讀 6938

與之前的那些比較排序不同,分配排序在排序過程無須比較關鍵字,而是通過"分配"和"收集"過程來實現排序。它們的時間複雜度可達到線性階:o(n)。常見的分配排序有計數排序(counting sort),基數排序(radix sort),桶排序(bucket sort),美國旗幟排序(american flag sort),珠排序(bead sort),**排序(burst sort),鴿巢排序(pigeonhole sort),相鄰圖排序(proxmap sort),閃電排序(flash sort)。下面介紹前三種:

(一)計數排序

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

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

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

最差空間複雜度:o(n+k)

穩定性:穩定

計數排序(counting sort),使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值等於i的元素的個數,然後根據陣列c來將a中的元素排到正確的位置。當輸入的元素是n個0到k之間的整數時,它的執行時間是o(n+k)。技術排序不是比較排序,排序數獨快於任何比較排序。由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍(等於待排序陣列的最大值與最小值的差加上1),這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如:計數排序是用來排序0到100之間的數字的最好的演算法,但是它不適合按字母順序排序人名。但是,計數排序可以用在基數排序中的演算法來排序資料範圍很大的陣列。

計數排序的一般步驟如下:

1.找出待排序的陣列中最大和最小的元素max和min,申請大小與a陣列相同的b陣列,和大小為(max-min+1)的c陣列;

2.統計陣列中每個值為i的元素出現的次數,存入陣列c的第(i-min)項;

3.對所有的計數累加(從c中的第乙個元素開始,每一項和前一項相加);

4.反向填充目標陣列:將每個元素i放在新陣列b的第(c(i-min)-1)項,每放乙個元素就將c(i-min)減去1;

5.將排序的b陣列拷貝回a陣列。

演算法示意圖:

實現**:

void countingsort(int *a, int len)

for (i=0; i最差時間複雜度:o(nk)

穩定性:穩定

基數排序(radix sort),一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較,首先按最低有效位數字進行排序。要保證基數排序是正確的,就必須保證按位排序是穩定的。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。

演算法示意圖:

實現**:

void radixsort(int *a, int len)

while (max/exp>0)

; for (i=0; i=0; i--)

b[--c[a[i]/exp%10]] = a[i];

for (i=0; i最差時間複雜度:o(n^2)

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

最差空間複雜度: o(n*k)

穩定性:穩定

桶排序(bucket sort),其原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。

桶排序的一般步驟:

1.設定乙個定量的陣列當作空桶子。

2.尋訪序列,並且把專案乙個乙個放到對應的桶子去。

3.對每個不是空的桶子進行排序。

4.從不是空的桶子裡把專案再放回原來的序列中。

例如:針對記錄的資料大小在[0,1)內,則把[0,1)劃分為n個大小相同的子區間,每一子區間是乙個桶。然後將n個記錄分配到各個桶中。因為關鍵字序列是均勻分布在[0,1)上的,所以一般不會有很多個記錄落入同乙個桶中。由於同一桶中的記錄其關鍵字不盡相同,所以必須採用關鍵字比較的排序方法(通常用插入排序)對各個桶進行排序,然後依次將各非空桶中的記錄連線(收集)起來即可。

一般情況下每個桶中存放多少個關鍵字相同的記錄是無法預料的,故桶的型別應設計成煉表為宜,而為了加快演算法效率,再往桶中放入記錄時就同時進行插入排序。

演算法示意圖:

實現**:

struct node;

int key(double a)

void bucketsort(double *a, int len)

for (int i=0; idata<=b[i].data)else

} q->next = &b[i];

b[i].next = p;

} for (int i=0, j=0; j<10; j++) }

delete b;

}

排序演算法C 實現

整理一下排序演算法。首先乙個陣列,a 我們先要從大到小經行排序 1.按照人們最直觀的思想,應該是一次次的遍歷,每次從裡面取最大的乙個,放到另乙個陣列裡面,這就是簡單選擇排序。2.我們從第乙個值開始,跟其後面的值對比,如果後面的大,則與後面的交換。那麼每一次的結果就是最小被放到了最後,接著是第二小的唄...

C 實現排序演算法

資料結構中有六大經典的排序演算法,分別是氣泡排序 選擇排序 插入排序 歸併排序 快速排序和堆排序,以下是用c 實現的六大經典演算法的 1.氣泡排序 include include include using namespace std 一次氣泡排序 void bubble int arr,int s...

演算法 排序(C 實現)

1.氣泡排序 氣泡排序採用兩兩比較的方式。如果要由小到大排序,並且從前往後遍歷,那麼將大的往後放,第一重迴圈是比較幾輪,也就是陣列個數,第二重迴圈是從 0 到總數減去輪數。氣泡排序 void mybubble vector values 2.快速排序 快速排序就是選擇乙個基準資料,然後在陣列中 後前...