第九章 排序演算法 希爾排序 基數排序

2021-10-20 22:12:39 字數 2369 閱讀 3993

一:希爾排序

1.介紹.

希爾排序是插入排序的改進版,主要是為了解決當較小的資料出現在待排陣列後乙個乙個向前插入這樣比較多的迴圈次數。這個排序引入的步長的概念(step),用不斷縮小step將陣列分組,每次縮小為原來的一半,直到最後一次步長為一時,整個陣列做了插入排序。

2.流程如下:

3.步驟

3.1.初始化步長為元素個數的一半

3.2.開始迴圈,迴圈至步長為0

3.3開始做插入排序,具體在**中詳解

4.**區

//希爾排序

void

shellsort

(int

*a,int len)

}//步長每次縮排一半

step >>=1;

//列印函式

print

(a, len)

;printf

("\n");

}}intmain()

;//選擇排序

//selectionsort(arr, 10);

//插入排序

//insertsort(arr, 10);

//基數排序

//cardinalsort(arr, 10);

//希爾排序

shellsort

(arr,10)

;return0;

}

列印結果

5.總結

對比很明顯,比插入排序插入的次數少。但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂。

二.基數排序

1.介紹

基數排序為什麼要有基數呢,因為它是靠著乙個原則(利用陣列下標的井然有序),即建立乙個臨時陣列,將陣列中的資料當做臨時陣列的下標,其他下標所對應的資料設為0或-1,,最後再將臨時陣列非0或非-1的資料賦值給a。也就有序了。

3.步驟

3.1.找出陣列中最大的資料

3.2.建立臨時陣列,開闢記憶體

3.3.臨時陣列全部賦值為-1

3.4.交換資料

3.5.吧臨時陣列的資料放回陣列

3.6.清空記憶體

4.**區`

//基數排序

void

cardinalsort

(int

*a,int len)

//2.建立臨時陣列,開闢記憶體

int temp = a[max_idex]

;int

*arr =

newint

[temp +1]

;//3.臨時陣列全部賦值為-1

for(

int i =

0; i < temp; i++

) arr[i]=-

1;//4.交換資料

for(

int i =

0; i < len; i++

) arr[a[i]

]= a[i]

;//5.吧臨時陣列的資料放回陣列

for(

int i =

0; i < temp; i++)}

//6.記憶體清空

delete

arr;

}int

main()

;//選擇排序

//selectionsort(arr, 10);

//插入排序

//insertsort(arr, 10);

//基數排序

cardinalsort

(arr,10)

;//希爾排序

//shellsort(arr, 10);

return0;

}

輸出結果

5.總結

5.1優點:

快5.2缺點比較多:

5.2.1.它只能儲存正整數

5.2.2.如果有資料過大,導致空間複雜度過高

5.2.3.不能重複

排序演算法九 基數排序

基數排序 radix sort 又叫桶排序 bucket sort 是一種 分配式排序 而非基於直接比較的排序方式,確切說這是一種匹配方式實現的排序。另外,實現這種排序要求所排序的序列按某乙個基數其排序是偏序方式排列,總體而言基數排序是字典序排序的一種實現形式。它的具體實現即對每一種偏序排序都採取關...

希爾排序 計數排序 桶排序 基數排序

希爾排序思路 複習一下插入排序 def insert sort li for i in range 1 len li j i 1 j 為手裡最大的牌 tmp li i while j 0 and li j tmp 只要手裡最大的牌比摸回來的牌大就一致往右移動 j 0 說明所有數都比摸到的牌要大,直接...

排序演算法 基數排序

基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...