插入排序監視哨和雞尾酒排序

2021-10-17 11:16:15 字數 2403 閱讀 6830

插入排序(帶監視哨):

思路:設定a[0]元素為監視哨,a[1]~a[n]存放資料

a[1]為第乙個元素,根據插入排序的思想,預設a[1[有序,從i = 2開始向前進行插入,如:

陣列:

|a| 0 | 1 | 2 | 3 | 4 | 5 |

|num| 0 | 5 | 4 | 3 | 1 | 8 |

(注:a[0]初始化為0)

注:如果不用監視哨,進行普通插入排序,則不用空出a[0],其中原來a[0]的作用可用乙個普通的int型變數臨時存放,比如int temp;用temp儲存待插入數的值。

普通插入排序,需要兩個關鍵步驟:1.找位置 2.移動陣列中數字「騰出」該位置,執行插入,temp變數存放待插入數謹防陣列移動時被「覆蓋」,所以需要二次遍歷。

帶監視哨的插排,遍歷過程中進行陣列的數字移動,找到位置後立即插入,只需一次遍歷。

以下為帶監視哨的方法:

**如下:

#include

#include

#define maxlen 10

void

insertsort

(int

* a)

;void

print

(int

* a)

;int

main

(void);

//初始化陣列

srand((

unsigned

)time

(null))

;//生成隨機數,賦給陣列

printf

("array number before sort:\n");

for(i =

1; i <= maxlen; i ++

) a[i]

=rand()

%101

;print

(a);

//輸出生成的隨機數陣列

insertsort

(a);

printf

("array number after sort:\n");

print

(a);

//輸出排序後的陣列

}void

insertsort

(int

* a)

return;}

void

print

(int

* a)

執行結果:

雞尾酒排序:

*為氣泡排序的改進:*感覺只是外層大迴圈次數少了,但是每一次迴圈內容增多了

注:小聲說一句:二者在處理亂序的眾多數字時,效率都很差,效率沒有本質提生,可能就是花活罷了,但是還是給出**:

#include

#include

#define n 10

void

cocksort

(int

* a,

int n)

;void

print

(int

* a,

int n)

;int

main

(void);

srand((

unsigned

)time

(null))

;for

(i =

0; i < n; i ++

) a[i]

=rand()

%101

;printf

("before sort:\n");

print

(a, n)

;cocksort

(a, n)

;printf

("經過排序:\n");

print

(a, n);}

void

cocksort

(int

* a,

int n)

}for

(; j > i; j --)}

}return;}

void

print

(int

* a,

int n)

執行結果:

完結

theend···

雞尾酒排序

氣泡排序是從陣列的一側到另一側為一輪,根據條件兩兩交換,例如關於氣泡排序中的一組資料3 2 5 4 6 1 8 9 7,優化的氣泡排序在經過六輪之後得到排好的陣列,而雞尾酒排序是一輪次比較兩回 先從左到右比較,如果左邊比右面大,交換位置 然後從右到左比較,左邊比右邊大,交換位置。就用冒泡中的那組數從...

雞尾酒排序

雞尾酒排序是一種定向的氣泡排序,也可以稱為攪拌排序 漣漪排序。是氣泡排序的一種變形。和氣泡排序的區別在於,雞尾酒排序採用了雙向比較並替換的原理。基本原理 第一步 宣告兩個臨時指標left和right,分別指向第乙個元素和最後乙個元素。第二步 每一輪比較時,從right往left方向查詢最大數,放到r...

雞尾酒排序

1.什麼是雞尾酒排序 雞尾酒排序,也稱定向氣泡排序 雙氣泡排序 攪拌排序 漣漪排序 來回排序 快樂小時排序,是氣泡排序的一種變形。2.與氣泡排序的區別 雞尾酒是雙向排序,可以得到較好的排序效能 3.排序過程 舉例 int arr new 第一趟排序 從左到右找到最大值放在最右端 第一次排序 2和4比...