快速排序是对冒泡排序的一种本质改进,它是不稳定排序。时间复杂度为O(nlogn)。
原理:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
例子:http://developer.51cto.com/art/201403/430986.htm(很清晰的例子)
代码实现:
void swap(int *arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void quickSort(int* a, int left, int right)
{
if (right <=left)
return;
int low = left;
int height = right;
int pivot = a[left];//基准数
while (low!=height)
{
//从右边开始找小于pivot的数
while (a[height] >= pivot && height > low)// (从右边先开始)
height--;
//从左边找大于pivot的数
while (a[low] <= pivot && height > low)
low++;
//左右哨兵找到后,交换
if (low < height)
swap(a, low, height);
}
//左右哨兵相遇
a[left] = a[height];
a[height] = pivot;
quickSort(a, left, low - 1);
quickSort(a, low + 1, right);
}