1.選擇乙個基準值(以最右邊為例)
2.分割區間:分割區間的結果是
小於等於基準值的 基準值 大於等於基準值的
3.分治:遞迴處理左右兩個區間。
遞迴邊界:
(1)區間內沒有數字了
(2)區間內只有乙個數字——即有序了。
1.hover法:
**:
法
int partition1(int arr, int left, int right)
//此時,該迴圈走完,begin下標所對應的數字就是大於基準值的
//開始走end
while (begin < end && arr[end] >= arr[right])
swap(arr, begin, end);
} //大迴圈走完,begin與end相遇,將begin/end下標所對應的數字與基準值交換
swap(arr, begin, right);
return begin;
}
2.挖坑法:思路與hover法一模不一樣。
**:
//2.挖坑法
int partition2(int arr, int left, int right)
//此時begin下標鎖定對應的數字一定大於基準值,直接填到end位置
arr[end] = arr[begin];
//開始走end
while (begin < end&&arr[end] >= pivot)
//此時,end下標所對應的值一定小於基準值,直接填到begin位置
arr[begin] = arr[end];
} //此時,begin與end相遇,將基準值填到此處即可
arr[begin] = pivot;
return begin;
}
3.前後下標法
**:
//3.前後下標法
int partition3(int arr, int left, int right)
} swap(arr, d, right);
return d;
}
void swap(int arr, int left, int right)
//2.挖坑法
int partition2(int arr, int left, int right)
//此時begin下標鎖定對應的數字一定大於基準值,直接填到end位置
arr[end] = arr[begin];
//開始走end
while (begin < end&&arr[end] >= pivot)
//此時,end下標所對應的值一定小於基準值,直接填到begin位置
arr[begin] = arr[end];
} //此時,begin與end相遇,將基準值填到此處即可
arr[begin] = pivot;
return begin;
}void quicksort(int arr, int left, int right)
//1.分割區間
int d = partition2(arr, left, right);
//2.分治左右兩個區間
quicksort(arr, left, d - 1);
quicksort(arr, d + 1, right);
}
問題一:1.問題:當選取的基準值是陣列的最值時,就會出現最壞情況,即分割的一半區間沒有數字,另一半區間是陣列的所有或絕大部分元素。
2.解決:三數取中法:
(1)取區間中間下標的數字,將左右邊界與其比較,返回中間大小數字的下標
(2)將選取的基準值與其交換即可
3.**:
int getmidindex(int* arr,int left,int right)
else if(arr[mid] < arr[right])
else
}else
else if(arr[mid] < arr[left])
else}}
最後只要在partition裡面先將得到的中間數字與要選擇的基準值進行交換即可。
問題二:當區間內部數字過多時,遞迴的層次較深,效能大打折扣。可以判斷如果區間內部數字較少的情況下,可以選擇插入排序。
if(right - left <= 16)
五.非遞迴1.實現:
(1)將左右邊界入棧
(2)取棧頂,出棧,拿到左右邊界
(3)判斷是否需要對區間進行分割--判斷區間內部元素的數目
(4)棧非空,就迴圈判斷分割區間,直到棧空,就代表排序完畢
2.**:
void quicksortnor(int* arr, int size)
}}
1.選擇基準值2.分割區間3.分治處理左右兩個小區間直到區間不必在分割--區間內部沒有數字,或只有乙個數字 資料結構 排序 快速排序
對序列 47,31,83,91,57,18,96,16 進行快速排序 首元素為基準 第二趟排序結果是 正確答案 b 你的答案 c 錯誤 18 31 16 47 57 91 96 83 16 31 18 47 57 91 96 83 16 18 31 47 57 91 96 83 16 18 31 4...
資料結構 排序 快速排序
快速排序在平均情況下是效果最好的排序演算法 每趟子表的排序都是從兩頭向中間交替逼近,接下來舉乙個例子 sorry,上面這個圖的6和5的位置畫反啦,快速排序全域性有序,一趟排序便可以確定基準值的最終位置 類別排序方法 最好時間 最壞時間 平均時間 空間複雜度 穩定性序列特徵 適用於插入排序 直接插入排...
資料結構排序 快速排序
快速排序是對氣泡排序的改進,它的基本思想是通過一趟排序將資料分成兩部分,一部分中的資料都比另一部分中的資料小,再對這兩部分中的資料再排序,直到整個序列有序,如下圖所示。快排的遞迴實現 1 include 2 include 3 4intn 5 6 7 分割使樞軸記錄的左邊元素比右邊元素小8 9int...