1. 枢纽元选取数组第一个元素,不过针对降序数组会有最坏时间复杂度O(N^2)
#include <iostream>
void qSort(int* a, int l, int r)
{
if(l < r)
{
int i = l;
int j = r;
int pivot = a[i];
while(i < j)
{
while(a[j] > pivot && i < j)
j--;
if(i < j)
a[i++] = a[j];
while(a[i] < pivot && i < j)
i++;
if(i < j)
a[j--] = a[i];
}
a[i] = pivot;
qSort(a, l, i - 1);
qSort(a, i + 1, r);
}
}
int main()
{
int a[] = {34, 32, 4, 2, 1, 0};
qSort(a, 0, 5);
return 0;
}
2. 选取随即数为枢纽元,这样一般可以避免碰到最坏时间消耗
#include <iostream>
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
};
int partition(int* a, int l, int r, int pi)
{
//swap pivot and the rigthmost element
swap(a[pi], a[r]);
int pivot = a[r];
int front = l;
//put all the elements less than pivot to the front part
for(int i = l; i < r; i++)
{
if(pivot > a[i])
{
swap(a[front], a[i]);
front++;
}
}
//put the pivot element into current front index position
swap(a[front], a[r]);
return front;
};
void qSort(int* a, int l, int r)
{
if(l < r)
{
int ran = l + rand() % (r - l + 1);
int p = partition(a, l, r, ran);
if(p - 1 > l)
qSort(a, l, p - 1);
if(r > p + 1)
qSort(a, p + 1, r);
}
}
int main()
{
int a[] = {52, 566, 1, 5, 0, 23, 12};
qSort(a, 0, 6);
return 0;
}