排序 | 快速排序
阿新 • • 發佈:2020-09-07
一、快速排序的原理
對於一個數組,我們可以隨機選定其中一個值,記為 m。
比m大的數,挪動到m的右邊。比m小的數,挪動到m的左邊。
然後,我們分別對左右兩邊再次進行快速排序。
當排序區間小到1的時候,快排就結束了。
二、程式碼
快排的程式碼細節在於如何調整下標。
void quicksort(vector<int>& a, int left, int right) {if (left >= right) return; int mid = left + (right - left) / 2; int midNum = a[mid];int leftp = left + 1; int rightp = right; // 把我們選定的值放在a[left],相當於把空位挖在目標陣列的首個位置。 swap(a[mid], a[left]); // leftp - 1 指向了下一個小於 mid 的數被放置的位置, // rightp 指向了下一個大於 mid 的數被放置的位置, // 當leftp - 1 = rightp,說明陣列已經分類完畢。 while(leftp <= rightp) { if (a[leftp] < midNum) { a[leftp- 1] = a[leftp]; leftp++; } else { swap(a[leftp], a[rightp]); rightp--; } } mid = rightp; a[mid] = midNum; // 對兩邊進行快排。 quicksort(a, left, mid - 1); quicksort(a, mid + 1, right); }