Quicksort快速排序演算法
阿新 • • 發佈:2018-12-18
快速排序演算法
思想:二分法,分治法,遞迴
排序例項 6 1 2 7 9 3 4 5 10 8 6為基準,也就是temp 先從右找第一個比基準數小的,再從左找第一個比基準數大的,進行交換,這裡必須從右邊先找的原因是因為基準數定的是最左的數。
如果選取最左邊的數a[left]作為基準數,那麼先從右邊開始可保證i,j在相遇時,相遇數是小於基準數的,交換之後temp所在位置的左邊都小於temp。但先從左邊開始,相遇數是大於基準數的,無法滿足temp左邊的數都小於它
找到7 和 5 6 1 2 7 9 3 4 5 10 8
交換後得到 6 1 2 5 9 3 4 7 10 8
依次類推,當得到 i == j 或 i > j時,排序無法繼續進行,此時情況如下 6 1 2 5 4 3
此時交換基準數與3 3 1 2 5 4 6 9 7 10 8
這樣就保證了基準數6左邊都比他小,右邊都比他大 這時,再將3設為基準數,在3 1 2 5 4 中進行快速排序,在9 7 10 8中進行快速排序 也就是進行遞迴排序演算法,最終就得到排序結果 1 2 3 4 5 6 7 8 9 10
#include <iostream> using namespace std; void QuickSort(int* a, int left, int right) { int i = left; int j = right; int temp = a[left]; int t = 0; if (left >= right) return; while (i != j) { while (i < j && a[j] >= temp)//a[j]<temp跳出迴圈,找到第一個a[j]<temp j--;//從右向左找第一個小於x的數 while (i < j && a[i] <= temp)//a[i]>temp跳出迴圈,找到第一個a[i]>temp i++;//從左向右找第一個大於x的數 //交換兩個數在陣列中的位置 if (i < j) { t = a[i]; a[i] = a[j]; a[j] = t; } } //將基準數歸位 a[left] = a[i]; a[i] = temp; QuickSort(a, left, i - 1); QuickSort(a, i + 1, right); return; } int main() { int n; int a[101] = {0}; cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } QuickSort(a, 0, n-1); for (int i = 0; i < n; i++) { cout << a[i] << ' '; } return 0; }
測試用例:
Input: 11 3 4 5 1 34 61 22 41 111 2 87
Output: 1 2 3 4 5 22 34 41 61 87 111