快速排序算法思想
找一个基准(第一个数据)
1)从后往前找比基准小的数据往前移动,
2)从前往后找比基准大的数据往后移动
3)重复1)和2)直到找到基准位置
这就是快速排序的一次划分,之后运用递归多次调用一次划分,直到完全有序。
快速排序的代码实现(递归)
//快速排序的一次划分
int Partition(int* arr, int low, int high)//O(n),O(1)
{
int tmp = arr[low];//基准
while (low < high)
{
//从后往前找比基准小的数字,往前移动
while (low<high && arr[high] > tmp)
{
high--;
}
if (low < high)
{
arr[low] = arr[high];
}
//从前往后找比基准大的数据,往后移动
while (low < high && arr[low] <= tmp)
{
low++;
}
if (low < high)
{
arr[high] = arr[low];
}
}
arr[low] = tmp;
return low;
}
void Quick(int* arr,int low, int high)
{
int par = Partition(arr, low,high);
if (low < par - 1)//左边的数据个数超过一个
{
Quick(arr, low, par - 1);
}
if (par + 1 < high)
{
Quick(arr, par + 1, high);
}
}
//快速排序
void QuickSort(int* arr, int len)//(nlogn),O(logn),不稳定(缺点)
{
Quick(arr, 0, len - 1);
}
快速排序的效率分析
O(nlogn),O(logn),不稳定
快速排序的特点
缺点:不稳定,空间复杂度大 快速排序最大的缺点:越有序越慢;完全有序时间复杂度为O(n^2)
快速排序如果越有序越慢,完全有序退化成选择排序