排序演算法 交換類排序

2021-07-25 07:31:02 字數 2258 閱讀 8340

今天我們討論一下交換類排序。

交換排序的演算法思想:通過交換逆序的元素實現交換排序。交換排序主要有兩種:一種是氣泡排序,一種是快速排序。

演算法思想:

氣泡排序是一種簡單的交換類排序演算法,它是通過交換相鄰兩個資料元素,逐步將排序序列變成有序序列。基本演算法思想描述如下:

假設待排序元素有n個,從第乙個元素開始一次交換相鄰的兩個逆序元素,直到最後乙個元素為止。第一趟排序結束,將最大的元素移動到序列末尾。按照上述方式進行第二趟排序,次大的元素將會被移動到倒數第二個位置。依次類推,經過n-1趟排序後,整個序列都是有序序列。每趟排序過程,值小的元素向前移動,值大的元素向後移動,就像氣泡一樣向上公升,因此被稱為氣泡排序。

排序過程:{}中為有序序列

初始狀態:56 72 44 31 99 21 69 80

第一趟:56 44 31 72 21 69 80

第二趟:44 31 56 21 69 72

第三趟:31 44 21 56 69

第四趟:31 21 44 56

第五趟:21 31 44

第六趟:21 31

第七趟:21

當第七趟完成後,序列第乙個數即為最小元素,所以全部序列有序。咦,怎麼回事,第五趟排序完成以後序列就全部有序了,怎麼還要進行後面的第六七啊?所以我們就對其做乙個小小的優化,當第k趟排序過後,發現沒有做任何交換,說明序列全部有序不需要再進行下面幾趟的排序了。

氣泡排序函式的實現:

void bubblesort(int a,int n) 

}if(!flag) break;//如果未發生交換,排序完成

}}

一下給出主函式的書寫,包括排序演算法和輸出序列函式的呼叫。

#include

void print(int a,int n);

void bubblesort(int a,int n);

int main() ;

bubblesort(a,8);

print(a,8);

return0;}

void print(int a,int n)

主要用途:

冒泡演算法簡單易懂,適用於待排序元素較少且對時間要求不高的場合。

穩定性與複雜度:

氣泡排序是一種穩定的排序方法。若有n個元素,則一般需要n-1趟排序,每趟排序需要進行n-i次比較,其中i=1,2,3…,n-1。時間複雜度為o(n2),空間複雜度為o(1)。

接下來咱們就來看看號稱快速排序的排序演算法。

演算法思想:

快速排序是氣泡排序算的改進,也屬於交換類排序演算法。基本演算法思想描述如下:

若待排序元素個數n個,放在a[0…n-1]中,在序列中選擇乙個pivot中,以pivot為基準,將小於pivot的元素放左邊,大於pivot元素放右邊。序列又被分為pivot左邊的序列和pivot右邊的序列,重複上述過程,直到每個序列都只有乙個元素為止。我們這裡為了討論方便,向將pivot選為每個序列的第乙個元素。(可能這樣做存在問題,可以隨機選取pivot將提高效率,今天先不討論)

未排序序列為:55 22 44 67 35 77 18 69

pivot=55,我們定義 i,j指標開始分別指向序列左端和右端,從右邊向左找乙個小於pivot(55)的數,j移動到18的位置,a[j] 賦值給a[i],從左邊向右找個大於pivot(55)的數和i移動到67的位置,a[i] 賦值給a[j],直至i>=j為止。最後將pivot賦值給a[i],完成此趟排序, 55 。重複上述過程,一直進行到每個序列只有乙個元素為止。

第二趟結果:18 55 77

第三趟結果:18 22 55 69 77

第四趟結果:18 22 44 55 69 77

第五趟結果:18 22 35 44 55 67 69 77

以上的排序過程,我們可以看出來快速排序可以通過遞迴呼叫實現,通過不斷的劃分,將乙個大問題劃分成子問題然後再合併,這個就是分治的思想。最後我們可以寫出快速排序的演算法。

void quicksort(int a,int n)

void qsort(int a,int low,int high)

主要用途:

快速排序是氣泡排序的改進,實現起來比較複雜,主要用於資料量較大的資料排序,它的時間效率遠高於氣泡排序。

穩定性與複雜性:

快速排序是不穩定的排序演算法,在資料量大時明顯。最壞時間複雜度o(n2),最好時間複雜度o(n2),平均時間複雜度為o(nlog2n)。快速排序空間複雜度o(log2n)。

排序演算法 交換類排序

在上一期我們學習了插入類排序的演算法後,知道了排序的一些基本的原理。然而實際上排序除了插入類排序以外,還有很多種類的排序演算法值得去學。比如,交換類排序,選擇類排序,歸併類排序還有基數類排序。而今天的交換類排序就有兩種演算法,它們分別是氣泡排序和快速排序。氣泡排序其實就是通過一系列的交換動作來達到排...

排序演算法之交換類排序

交換類排序的思想,顧名思義,就是在每一輪的排序過程,通過不斷的交換來使每個元素到達最終的位置。常見的兩種交換類排序有氣泡排序和快速排序。氣泡排序作為最基礎的排序演算法,它的排序思想也如其名,通過比較兩個相鄰資料的大小,來決定是否交換它們的位置,最後經過多輪排序最終是整個序列有序。網上找到的gif 分...

排序 交換類排序

演算法思想 陣列中第乙個元素和第二個元素比較,按照規則進行交換,再讓第二個和第三個進行比較,直到最大或最小的那個數交換到最後,一趟氣泡排序完成。以公升序為例,氣泡排序主要是讓大的下沉,小的上浮,每一趟排序確立乙個當前無序序列中最大的那個數,使之下沉。時間複雜度分析 最壞 整個陣列逆序,最內層迴圈的語...