資料結構 快速排序

2021-09-12 11:26:44 字數 1520 閱讀 6411

快速排序是氣泡排序的公升級,都屬於交換排序類。

快排的基本思想是:通過一趟排序將待排序記錄分割成兩部分,其中一部分的每個關鍵字都比另一部分記錄的關鍵字小,則可以分別對這兩部分記錄繼續進行排序,已達到整個序列有序。

其複雜度最優的情況下為o(nlogn),最壞的情況下為o(n^2)。

**如下:

void quicksort(vector&seq, int low, int high)

return;

}

此部分中,是利用partition函式找出能將序列分成兩個部分的那個關鍵字的索引位置,此關鍵字前面的序列元素均比它小,後面的元素均比它大,然後將前面序列與後面序列進行遞迴完成同樣的操作,最終保證序列有序。

int partition(vector&vec, int low, int high)

//swap(vec[low], vec[high]);

vec[low] = vec[high];//此部分使用直接替換,可以省去交換所耗費的時間

while (low < high&&vec[low] <= pivotkey)

//swap(vec[low], vec[high]);

vec[high] = vec[low];

} vec[low] = tmp;

return low;

}

在上面函式中,首先將首元素設為乙個樞紐,然後從兩端開始不停的比較,最終將樞紐元素放在乙個合適的位置,保證前面的元素都比它小,後面的都比它大,並返回這個樞紐元素最後的位置。

上述將樞紐元素先暫存,然後將swap操作變成發現有元素的位置不合適時,直接替換,最後直接將暫存的樞紐元素直接放到它最後需要呆的位置,是一種優化策略。

完整**如下:

int partition(vector&vec, int low, int high)

//swap(vec[low], vec[high]);

vec[low] = vec[high];//此部分使用直接替換,可以省去交換所耗費的時間

while (low < high&&vec[low] <= pivotkey)

//swap(vec[low], vec[high]);

vec[high] = vec[low];

} vec[low] = tmp;

return low;

}void quicksort(vector&seq, int low, int high)

return;

}int main()

; //vectorvec;

quicksort(vec, 0, vec.size() - 1);

for (auto i : vec)

system("pause");

return 0;

}

輸出驗證:

資料結構 排序 快速排序

對序列 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...