八大排序演算法之交換排序

2021-08-07 02:28:12 字數 2686 閱讀 3711

在之前的兩篇部落格中,我們分別說了插入排序和選擇排序,有興趣的同學還可以戳鏈結去看看八大排序演算法之選擇排序、八大排序演算法之插入排序。

交換排序主要說得是氣泡排序和快速排序,思想就和名字一樣是用交換來實現的。

1.氣泡排序

基本思想:在要排序的陣列中,對當前還沒排好序的範圍內的全部數,進行依次比較,以公升序為例,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

穩定性:因為是冒泡,所以不會改變相同元素的相對位置。

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

氣泡排序比較簡單,這裡就不畫圖描述了,直接上**。

void bubblesort(int

*a, int

size)}}

2.快速排序

快速排序是我們最常用的排序,這裡我們說三種快排的方法:左右指標法、挖坑法、前後指標法。

<1>左右指標法

基本思想:以當前的某個數為基準,然後找出第乙個比它大的,第乙個比它小的,然後進行交換。兩個指標向中間靠近,當左右指標相等的時候,這次迴圈就結束了。然後不斷遞迴縮小區間,直到所有的區間都有序。

//以乙個數為基準,然後找比它大的和小的,然後交換,直到這兩個指標相遇

//和中間的那個數進行交換,以這個數為界,左邊的都小,右邊的都大

int partsort1(int *a, int left, int right) //左右指標法

swap(a[begin], a[right]);

return begin;

}

如果當前陣列是個和我們排序相反的有序陣列,這麼這種情況是快排的最差情況,此時我們可以考慮在選擇基準的時候進行優化下。在這裡,最簡單的優化就是三數取中法。我們在left和right找到中間的位置,然後根據這個mid進行比較,最後在按照我們上面的繼續執行。

//當陣列有序的時候,快排的情況最差,這個時候可以採用三數取中法

int getmid(int *a, int left, int right)

else //mid left

}

<2>挖坑法

基本思想:以最後乙個數為基準,將這個基準儲存在key中,從左找大於key的,找到了就和end交換;然後從右找小於key的,找到了就交換;最後把比key大/小的都放在了合適的位置上

一趟排序的過程如上,如果你還是不明白。就直接跳過去看**就好了。

int partsort2(int *a, int begin, int

end) //挖坑法

a[begin] = key;

return begin;

}

<3>前後指標法

基本思想:也是在找比key大的或者小的,但這裡它是從乙個方向開始找的。用兩個指標分別儲存大於和小於,然後找到就進行交換。

這裡就不畫圖了,直接用**來說明思路。

int partsort3(int *a, int begin, int end)  //前後指標法

}swap(a[++prev], a[end]);

return prev;

}

可以看出,上面三種排序的思路都是一樣的,先找出乙個基準,然後通過查詢比基準大的和小的來進行比較,通過比較,完成排序,然後不斷縮小區間去排序。

void quicksort(int *a, int left,int right)

<4>快速排序的非遞迴實現

有時候進行筆試或者面試的時候,可能要求你寫個快排但是不能使用遞迴。這個時候千萬不能慌,一定要想清除快排的根本是什麼,然後借助合適的資料結構來完成。

在上面實現的快排中,我們可以看出遞迴的部分是不斷縮小區間的這個範圍,假設現在我們是在作業系統內部,那麼每次遞迴的時候就是建立乙個新的棧幀的時候,所以可以聯想到棧來實現。也就是說,我們可以利用棧來儲存每次更改的區間。其他部分的思路還是一樣的,想到這裡是不是有種豁然開朗的感覺?話不多說,**奉上。

void quicksortnonr(int *a, int left, int right)

if (mid + 1

< right)}}

對快速排序來說,兩個指標分別查詢相較於基準值大或者小的,所以相同元素的相對位置可能會發生改變,即快排是不穩定的。

到現在為止,常見的排序我們已經說了6種,下篇部落格將會說最後的兩種,並且對所有的排序演算法做個總結。

八大排序演算法之交換排序

在之前兩篇文章中,我們學習了插入排序和選擇排序,八大演算法之插入排序,八大演算法之選擇排序,這篇文章,我們來了解一下交換排序。常用的交換排序有氣泡排序和快速排序,主要思想就是交換。1.氣泡排序 基本思想 每相鄰兩個數比較,若大小與要排序順序不同,則交換。將序列當中的左右元素,依次比較,保證右邊的元素...

八大排序 交換排序之 氣泡排序

起泡排序 bubble sort 的演算法思想是 設待排序有n個記錄,首先將第乙個記錄的關鍵字r1.key和第二個記錄的關鍵字r2.key進行比較,若r1.key r2.key,就交換記錄r1和r2在序列中的位置 然後繼續對r2.key和r3.key進行比較,並作相同的處理 重複此過程,直到關鍵字r...

排序演算法之交換排序

交換排基本思想 兩兩比較待排序元素的關鍵字,發現兩個元素的次序相反時即進行交換,知道沒有反序的元素為止。本節介紹兩種交換排序,即氣泡排序和快速排序。氣泡排序 每次只能和相鄰的位置數進行交換,效率低 include int a 100 void quicksort int left,int right...