選擇排序和氣泡排序演算法上比較像,每次都從未排好的序列中選擇乙個最大(或最小)的數,放在已經排好的序列中的最後面
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 基數排序 直接插入排序 說明 逐個將後乙個數加到前面的排好的序中。在直接插入排序過程中,對其中乙個記錄的插入排序稱為一次 排序 直接插入排序是從第二個記錄開始進行的,因...