資料結構 快速排序

2021-09-24 11:23:55 字數 3097 閱讀 7953

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...