資料結構筆記 排序(2)

2021-10-12 02:14:44 字數 1823 閱讀 4702

選擇排序和氣泡排序演算法上比較像,每次都從未排好的序列中選擇乙個最大(或最小)的數,放在已經排好的序列中的最後面

int a =

公升序序列:

我們還是把它分為兩組,已排好的序列,未排好的序列

初始狀態

已經排好的序列

沒有排好的序列 49 38 65 ,97 ,76 ,13 ,27 ,49

陣列a =

以下為插入排序操作

第一趟:1349 65 97 76 38 27 49

第二趟:13 2765 97 76 49 38 49

第三趟:13 27 3897 76 65 49 49

第四趟:13 27 38 4976 65 97 49

第五趟:13 27 38 49 4965 97 76

第六趟:13 27 38 49 49 6597 76

第七趟:13 27 38 49 49 65 7697

下面用**實現

//交換陣列中兩個值

void

swap

(elementtype a,

int s,

int r)

void

selectsort

(elementtype a,

int n)

}show

(a,n)

;}

分析

可以直接從**中看出,有兩層for迴圈,且無論初始序列如何,都將比較

(n-1)+(n-2)+…1 = n*(n-1)/2

時間複雜度為o(n^2)

氣泡排序的思想和選擇排序差不多,每次比較兩個元素,相比較大(較小)的那個向後移動,從而達到每一趟將最大(最小)的那個移動到最後面。

int a =

以下為氣泡排序操作

第一趟:38 49 65 76 13 27 4997

第二趟:38 49 65 13 27 4976 97

第三趟:38 49 13 27 4965 76 97

第四趟:38 13 27 4949 65 76 97

第五趟:13 27 3849 49 65 76 97

第六趟:13 27 38 49 49 65 76 97

可以發現,第五趟的時候,就已經全部按照順序排完了,但是我們又進行了第六趟,在第六趟中,我們沒有移動元素,但是進行了兩次比較。可以這樣理解,如果在某一趟中僅僅比較元素沒有移動元素,那麼這個序列就已經排好序了。

以下是**實現

void

bubblesort

(elementtype a,

int n)}if

(over==

true

)break

;//如果沒有元素移動,僅有元素比較,序列已經排好了,跳出迴圈

}}

分析

如果序列是正序,那麼僅需一趟比較,無需移動元素,反之如果是逆序,就需要n-1趟排序,需要進行n*(n-1)/2次比較,並移動相同的次數。

總的時間複雜度為o(n^2)

資料結構筆記 排序

排序 1 插入排序 直接插入排序和希爾排序 2 選擇排序 直接選擇排序和堆排序 3 交換排序 氣泡排序和快速排序 4 歸併排序 5 基數排序 直接插入排序 說明 逐個將後乙個數加到前面的排好的序中。在直接插入排序過程中,對其中乙個記錄的插入排序稱為一次 排序 直接插入排序是從第二個記錄開始進行的,因...

資料結構筆記 排序

排序 1 插入排序 直接插入排序和希爾排序 2 選擇排序 直接選擇排序和堆排序 3 交換排序 氣泡排序和快速排序 4 歸併排序 5 基數排序 直接插入排序 說明 逐個將後乙個數加到前面的排好的序中。在直接插入排序過程中,對其中乙個記錄的插入排序稱為一次 排序 直接插入排序是從第二個記錄開始進行的,因...

資料結構筆記 排序

排序 1 插入排序 直接插入排序和希爾排序 2 選擇排序 直接選擇排序和堆排序 3 交換排序 氣泡排序和快速排序 4 歸併排序 5 基數排序 直接插入排序 說明 逐個將後乙個數加到前面的排好的序中。在直接插入排序過程中,對其中乙個記錄的插入排序稱為一次 排序 直接插入排序是從第二個記錄開始進行的,因...