快排總結00

2021-10-24 12:54:15 字數 1861 閱讀 4336

基於六大基本排序的學習:

快速排序

廢話不多說直接上**

void

quick_sort

(int left,

int right,

int* arr)

} arr[left]

= arr[i]

; arr[i]

= base;

quick_sort

(left,i-

1,arr)

;quick_sort

(i+1

,right,arr)

;}

然後我們一步一步解析理解:

首先是形參,形參內我們運用left,right來指向陣列的開始與結束端。

然後是函式體內:

由於快排應用的是遞迴演算法,所以要有乙個遞迴的出口,即當最左端大於等於最右端時,函式就從此截止,然後依次結束之前的遞迴。

然後找乙個i和j使其分別等於left與right,再找乙個「準基數」,這裡我們常用的準基數就是arr[left],然後就是進行最主要的演算法。

首先的大迴圈條件是當 i < j,這裡的意思最左端不能等於或超過最右端,其實是為了i == j作鋪墊,然後小迴圈中***一定要先進行 j-- 的操作***。

j–的操作條件就是從這個陣列的right開始,從後向前遍歷找到乙個小於等於準基數base的數值***並且要求此時的 j >= i***,然後停留在此;

i++的操作條件與其類似,不過是找到乙個大於等於準基數base的數,並且要求此時的 i <= j,然後停留在此。然後判斷此時的 i 是否真的小於 j,如果判斷為真的話,將位於 i 和位於 j 位置上的數值交換。重複上述步驟,直到 i == j,然後進行陣列起始端數值的改變,將arr[i](或arr[j],因為此時i == j) 賦值給arr[left],再將base賦值給當前的aa[i]。然後進行向左和向右的遞迴操作。

給個例題

#include

using

namespace std;

void

quick_sort

(int left,

int right,

int* arr)

} arr[left]

= arr[i]

; arr[i]

= base;

quick_sort

(left,i-

1,arr)

;quick_sort

(i+1

,right,arr);}

intmain()

for(

int i =

0;i) cout<

<<

" ";

cout<

quick_sort(0

,n-1

,a);

for(

int i =

0;i) cout<

<<

" ";

}

得出的結果是

我現在只解釋一下第一次迴圈

首先base = arr[left] = 3;

然後i = 0,j = n - 1 = 9;

從j開始從後往前遍歷

j一直減到了2

然後i開始從前往後遍歷,當i等於2時雖然沒找到大於等於base的數,但由於i再增加導致了i > j,所以i只停留在了2處。然後此時不滿足了i < j,所以直接進行arr[left] = a[i]; a[i] = base;的操作,然後進行左右遞迴,最後發現(也是巧合原因)這個陣列只需要進行一次排序即可。

排序總結 快排

快速排序是最常用的排序演算法,基本思想是分治。隨機找乙個分割數,把比他小的數放他左邊,比他大的數放他右邊。對左邊的數和右邊的數再分別重複以上操作。void qsort int arr,int low,int high 其中,劃分函式partition是關鍵。該函式有兩個作用,首先是根據中心點對陣列進...

排序總結 快排 歸併 堆排

1.煞筆快排 假設我們對陣列進行快速排序。首先在這個序列中找乙個數作為基準數,為了方便可以取第乙個數。遍歷陣列,將小於基準數的放置於基準數左邊,大於基準數的放置於基準數右邊。此時得到類似於這種排序的陣列。在初始狀態下7是第乙個位置,現在需要把7挪到中間的某個位置k,也即k位置是兩邊數的分界點。那如何...

呼叫快排函式總結

快速排序 標頭檔案 include 函式 qsort 首位址,數目,單個元素位元組大小,方法 公升序 降序 例項 陣列 include includeusing namespace std int order const void a,const void b int reorder const v...