基於六大基本排序的學習:
快速排序
廢話不多說直接上**
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...