快速排序是最常用的排序演算法,基本思想是分治。隨機找乙個分割數,把比他小的數放他左邊,比他大的數放他右邊。對左邊的數和右邊的數再分別重複以上操作。
void qsort(int* arr, int low, int high)
}
其中,劃分函式partition是關鍵。該函式有兩個作用,首先是根據中心點對陣列進行粗糙的排序,即「
小數去左大數去右
」;其次是返回排序後中心點的位置,便於下一步遞迴。
劃分函式的核心思想是用low和high兩個指標來標記掃瞄的位置,low
從左向右進行掃瞄,找比key大的數並和high所在的數進行交換(僅交換數值,指標未變),high
從右向左進行掃瞄,找key小的數並和low進行交換,以此類推交替進行。記住:
low和low左邊的數都是比中心點小或等的數,代表已經排好的部分,不需要再動。high和high右邊的數同理。掃瞄和交換過程只針對兩指標中間的這一部分,直至兩指標重合。
int partition(int* arr, int low, int high) {
int pivot = arr[low]; //取中心點(可以是端點,也可以是中間位置的某點)
while (low= pivot) --high; //從右向左掃瞄,遇到比中心點小的值時停止
arr[low] = arr[high];
arr[high] = pivot; //將小值和中心點進行交換
while (low因為是取arr[low]為中心點,所以最開始時是從右往左掃瞄,找到小值與low下標對應的中心點進行交換。交換後,中心點到了high下標裡,再從左往右掃瞄。。。迴圈直至兩下標碰面,它們共同指向的還是中心點。也就是說,自始至終,都是中心點和它們交換,知道把中心點送到正確的位置。
排序總結 快排 歸併 堆排
1.煞筆快排 假設我們對陣列進行快速排序。首先在這個序列中找乙個數作為基準數,為了方便可以取第乙個數。遍歷陣列,將小於基準數的放置於基準數左邊,大於基準數的放置於基準數右邊。此時得到類似於這種排序的陣列。在初始狀態下7是第乙個位置,現在需要把7挪到中間的某個位置k,也即k位置是兩邊數的分界點。那如何...
排序演算法總結 插入 歸併 快排
void selectionsort int arr,int n swap arr minidx arr times times 對於近乎有序的陣列,排序效率很高,時間複雜度接近o n 基礎版 void insertionsort int arr,int n 優化版 減少不斷交換中的重複賦值 voi...
快排 堆排序
快速排序主要運用了二分的思想,每次選擇乙個基準元素,比基準元素打的元素都放在基準元素前面,比基準元素小的元素都放在基準元素後面,這樣不斷遞迴細分,完成排序。void quicksort int a,int l,int r if ia i a j i while ia i temp if ia j a...