c 實現快速排序

2021-10-06 13:45:04 字數 1774 閱讀 9661

快速排序是對氣泡排序的一種改進,由 c.a.r.hoare(charles antony richard hoare,東尼·霍爾)在 1962 年提出。

快速排序的核心思維

每次都取陣列的第乙個元素作為基準元素,凡是大於這個基準元素的都放在他的右邊,凡是小於這個基準元素的都放在它的左邊,具體步驟如下:

設定兩個變數i和j(也稱為哨兵),令序列第乙個元素作為基準元素

i指向序列的最左邊,j指向序列的最右邊,j從右往左試探,i從左往右試探,直到j找到小於基準的數就停止,i找到大於基準的數就停止,交換i和j指向的兩個數,j繼續往左試探,i繼續往右試探

如果i和j相遇,則i或j上的元素與基準元素交換,則這一輪排序結束

對基準元素兩邊的序列重複以上操作

這裡以陣列 6 2 7 3 9 8 為例,我們的基準元素取首元素6,首先i和j分別為頭和尾元素。根據步驟2中,首先j往左邊移動直到遇到第乙個比6小的元素

此時的j到3這兒,然後i開始往右邊移動直到找到第乙個比基準元素大的元素,此時找到了7

然後交換i和j指向的兩個資料

然後j接著往左邊移動再找到第乙個小於基準的資料,但是這兒i和j在3數字這兒相遇,由此根據步驟3,把i或j(因為此時的i和j都指向同乙個數字3)與基準元素進行交換,這樣就完成了第一輪的交換。

此時會發現基準元素6的左邊都是比6小,右邊都是比6 大,由此第一輪排序結束,然後分別接著對 3 2 這兩個數字重複上面的操作(即將3作為基準元素,然後3 和2分別為頭和尾元素),7 8 9 也重複上面的操作,最後就可以完成整個陣列的排序

下面是c++**實現:

#include

#include

using std::cout;

using std::endl;

using std::vector;

using std::swap;

void

quicksort

(vector<

int>

& vi,

int lo,

int hi)

while

(vi[i]

<= pivot && j > i)

if(i

}swap

(vi[lo]

, vi[i]);

quicksort

(vi, lo, i-1)

;quicksort

(vi, i+

1, hi);}

}int

main()

;quicksort

(s,0,5

);for(

auto x:s)

return0;

}

排序 快速排序,C 實現

本文 的github位址 基本思想 快速排序 是對 氣泡排序 的改進。基本原理 基於分治法,在待排線性表中取乙個元素pivot作為樞軸值,通過一趟排序將待排線性表劃分為獨立的兩部分,第一部分的所有元素小於pivot,第二部分的所有元素大於等於pivot,pivot位於其最終位置。遞迴對兩個子表做快速...

快速排序 c 實現

快速排序思想 基於分治策略,對氣泡排序的一種改進。對於要排序的乙個序列,從中選一值進行排序,將其放入到正確的位置position。然後以position為界,對左右兩部分再做排序。直到劃分的長度為1。步驟 設有一待排序的序列 1.分別設定low hight指向序列的最左端 最右端 從序列中選乙個進行...

快速排序(C 實現)

include using namespace std void swap int a,int b int sort int begin,int end if beginwhile beginif begin return begin void quicksort int begin,int end...