题目:
给定一个无序整数数组arr,请使之有序。
思路:
找到一个数p,把arr分成两部分,左边部分所有数都小于或等于p,右边部分所有数都大于或等于p。然后对左右两部分继续应用此规则。如何找数p? 首先让p等于arr[0],然后两个指针l、r从左右两边同时遍历,左边遇到大于p的数,停下,右边遇到小于p的数,停下,然后交换l、r。重复这个动作,直到l、r相遇。然后arr[0]和arr[l]交换。此时数组被p分为左右两部分,左边的数都小于p,右边的数都大于p。
代码:
class QuickSort {
public:
void quickSort(vector<int>& arr,int left, int right) {
if (left < right) {
int l = left, r = right;
while (l < r) {
while (l < r && arr[left] <= arr[r]) {
r--;
}
while (l < r && arr[left] >= arr[l]) {
l++;
}
int tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
}
int tmp = arr[l];
arr[l] = arr[left];
arr[left] = tmp;
quickSort(arr, left, l - 1);
quickSort(arr, l+1, right);
}
}
};