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

2021-08-04 22:10:21 字數 1776 閱讀 5075

交換類排序的基本思想:通過一系列交換逆序元素進行排序的方法。

氣泡排序

氣泡排序的基本思想:顧名思義就是像冒泡一樣,兩兩比較,將大值(小值)後移,最後最大值或最小值排到最後。

優化:資料是有序的,在遍歷一次時沒有交換資料,所以資料是有限的,可以設定乙個標記為flag

//氣泡排序優化,定義乙個標誌器,

void bubblesort_p(int arr, size_t size)

}if (flag)

break;

}}

時間複雜度:

最好的情況是,資料有序,遍歷一遍 o(n)

最差的情形是,o(n^2)

氣泡排序是穩定的排序。

快速排序

遞迴實現

快速排序的基本思想:從待排序記錄序列中選取乙個記錄(通常選取第乙個記錄)為樞紐,將小於該記錄的值移到前面,大於該記錄的的值移動後面,然後將該記錄插到分界線處,這個過程為一趟快速排序。對分割後子表繼續分割,直到所有子表的表長不超過1。

方法1、

其實我更喜歡稱為挖坑埋坑

演算法步驟:設定兩個標誌i = left,j = right,首先將基準記錄arr[i] 給儲存到temp處,使r[i]為空,即挖坑,然後反覆進行下面兩個掃瞄工作,直到i和j相遇

(1)j從右向左掃瞄,找到乙個比temp小的元素r[j],然後把r[j]賦值給r[i] 「填坑」,–j,此時r[j]為乙個新的坑

(2)i從左向右掃瞄,找到乙個比temp大的元素r[i],然後把r[i]賦值給r[j] 「填坑」,++i,此時r[i]為乙個新的坑

當i和j相遇時,此時該位置為乙個空位置,將temp賦值給該位置。

int partition(int arr, int begin, int end)//閉區間

while (begin

< end && arr[begin] < key)

begin++;

if (begin

< end)

}arr[begin] = key;

return

begin;

}void quicksort(int arr,int left,int right)

}

方法2、

公升序:雙指標**,定義兩個指標,乙個指標prev的指向比key值大的位置,另乙個指標cur找比key值小的位置,cur!=prev,交換兩個值。

void paratition(int arr,int left,int right)

return prev;

}void quicksort(int arr,int left,int right)

}

非遞迴版本

void quicksort_nor(int arr,int

left,int

right)

}}

該排序是非穩定排序。

什麼時候快速排序最壞?怎麼避免最壞情況的出現?

最壞的情況下:

(1)基本有序時,退化為氣泡排序,幾乎要比較n*n次,故為o(n*n)

(2)基準值每次都在開頭選導致分割槽不平衡

優化:

快速排序的時間複雜度:o(n*lgn)

最壞的情況下:o(n^2)

c 交換類排序演算法(氣泡排序 快速排序)

氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。演算法步驟...

快速排序 氣泡排序 交換類排序 講解

每一趟排序選擇當前序列中的第乙個關鍵字 通常是第乙個 作為樞紐,而快速排序要做的就是把比樞紐小的關鍵字交換到樞紐前面,比樞紐大的關鍵字交換到樞紐後面。本趟排序完後會生成新的子串行,而子串行會成為下一趟排序的初始序列。通過例子來講明快速排序的規則 總結而言就是 首為樞紐,左i右j,先j後i,j從右向左...

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

在排序演算法中,氣泡排序和快速排序都可以歸為交換排序演算法。這是因為這兩個演算法就是通過不斷的元素之間的交換來實現元素的排序。其中快速排序是所有排序演算法中綜合性能最佳的演算法,因此需要深入理解。氣泡排序 以陣列為例,給定一組數a n 1 選擇a 0 a 1 a i a n 2 中乙個元素進行一趟冒...