思路:分治算法思路(分解,解决partition,合并),最差时间复杂度为O(n^2),平均时间复杂度为O(n logn),不稳定
void quicksort(int arr[], int length, int l, int r)
{
if (l == r)
return;
int p = partition(arr, length, l, r);
if (p > l)
quicksort(arr, length, l, p - 1);
if (p < r)
quicksort(arr, length, p + 1, r);
}
int partition(int arr[], int length, int l, int r)
{
int x = arr[r];
int i = l - 1;
for (int j = 1; j < r; j++)
{
if (arr[j] <= x)
{
i++;
exchange(arr[i], arr[j]);
}
}
exchange(arr[i + 1], arr[r]);
return i + 1;
}
void exchange(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
举例子:剑指offer中的《数组中出现次数超过一半的数字》、《寻找数组中的第K大数》、《输出数组中的前K个最小的数》