排序演算法 交換排序之氣泡排序和快速排序

2021-08-21 04:08:02 字數 1573 閱讀 2459

在排序演算法中,氣泡排序和快速排序都可以歸為交換排序演算法。這是因為這兩個演算法就是通過不斷的元素之間的交換來實現元素的排序。其中快速排序是所有排序演算法中綜合性能最佳的演算法,因此需要深入理解。

氣泡排序:以陣列為例,給定一組數a[n]。

(1)選擇a[0]、a[1].....a[i].....a[n-2]中乙個元素進行一趟冒泡,假設為a[i]。(一共n-1趟冒泡)。

(2)這趟冒泡中需要逐個對比a[n-1]到a[i]的值,將最小值交換到a[i]。

(3) i++。 重複(1)、(2)。

這樣經過n-1趟後,n-1個元素都已經排好序,則n個元素都已經排好序。

**實現如下,以陣列為例:

void bubblesort(int a,int n)

}if(flag == false) //如果flag為true,說明上次遍歷沒交換元素,則陣列已經有序。提早結束節省執行時間

return ;

}}

氣泡排序的時間複雜度最壞情況是o(n^2),平均也是o(n^2)。空間複雜度為o(1)。

氣泡排序演算法是穩定的。

快速排序:快速排序實際是對氣泡排序的一種改進,基本的思想是分治法。以陣列為例:

(1)在陣列a[n]中,選擇乙個元素為基準,假設這個元素的值為pivot。

(2)經過一趟排序,將a[n]分成兩部分,a[0~k-1]和a[k+1~n-1]。其中a[0~k-1]的值都小於pivot,a[k+1~n-1]的值都大於pivot,a[k]=pivot。

(3)再對兩個子串行a[0~k-1]和a[k+1~n-1]進行同樣的操作,直到子串行只有乙個元素,排序就完成了。

**如下,以陣列為例:

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

{ if(low=p) --high;

a[low] = a[high]; //找到乙個比基準元素小的然後移到左端

while(low上述**是遞迴的方法,**可能有些難懂。其實只要理解第一次的排序過程就好,子串行的操作與第一次是一樣的。不需要深究其中的遞迴過程。

舉例:有一組數:45

1263

以4為基準元素,第一趟排序過程如下:

第一次迴圈:   35

1263

3512

65第二次迴圈:32

1265

3214

65第一趟排序完成。可以看出,基準元素4現在所在的位置也是最終排序完成後它該在的位置。對4左右的序列進行同樣的過程,即可以完成排序。

時間複雜度:最壞情況o(n^2),最佳情況o(nlogn)。實際情況下的時間複雜度接近最佳情況o(nlogn)。

空間複雜度:最壞情況是o(n),最佳情況o(logn)。

快速排序演算法是不穩定的,它會導致兩個相等值的元素在排序後相對位置發生變化。

排序演算法 交換排序之冒泡

一 主要思想 顧名思義,交換排序的主要操作是交換,其主要思想是在待排序列中選兩個記錄,將它們的關鍵碼相比較,如果反序 即排列順序與排序後的次序正好相反 則交換它們的儲存位置。二 需要解決的關鍵問題 1 在一趟起泡排序中,若有多個紀錄位於最終位,應如何記載 解決方法 設定變數 exchange 記載記...

排序 交換排序之氣泡排序

在排序演算法中還有一大類是交換類排序,其中最為常見,最好理解的便是氣泡排序了。氣泡排序的演算法思想 通過無序區中相鄰記錄關鍵字的比較和位置的交換,使得關鍵字最小 最大 的記錄如冒泡一般上浮,至水面 有序區 整個演算法從最下面的記錄開始,對每兩個相鄰的記錄的值進行比較,使關鍵字較小的交換至較大的記錄之...

交換排序之氣泡排序

大學學的演算法已經基本遺忘了,最近又重新撿起來好好鑽研一下,那麼就先從排序開始。先說交換排序中的氣泡排序,這個是比較基礎的乙個排序演算法。1 基本思想 在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即 每當兩相鄰的數比較...