1.快速排序算法思想
快速排序的思想是在数组[p,r]中选择一个分区点q,将数组一分为2,同时将小于分区点的数值的放到分区点左侧[p,q-1],大于分区点的数值的放到分区点右侧[q+1,r],重复这个过程。
2.具体算法代码
//第一部分:排序算法
//9-1 快速排序
//2020.09.20
void QuickSort(int arr[],int low,int high)
{
int temp;
int i=low,j=high;
if(low<high)
{
temp=arr[low]; //在每个子程序开始时,把arr[low]的值赋给temp
while(i<j)
{
while(i<j&&arr[j]>=temp) --j;//把j往左移动,一直移动到i=j或者arr[j]<temp的位置
if(i<j)//用arr[j]的值覆盖arr[i]的值
{
arr[i]=arr[j];
i++;
}
while(i<j&&arr[i]<temp) ++i;//执行此处时,要把arr[i]往右移动,找到一个arr[i]>temp的值,然后覆盖arr[j]
if(i<j)
{
arr[j]=arr[i];
j--;
}
}
arr[i]=temp;//该算法实现的巧妙之处就在于,数组中是有n个值的,找一个temp来记录一个值,然后覆盖
QuickSort(arr,low,i-1);//分治法求解左边部分
QuickSort(arr,i+1,high);//分治法求解右边部分
}
}
3.复杂度分析
- 时间复杂度:最好:O(n log2 n),最坏:O(n^2),平均:O(n log2 n)(很优秀)
- 空间复杂度:O(n log2 n)
- 稳定性:不稳定
举例:6,8,7,6,3,5,9,4,在经过第一次分区操作之后,两个6的顺序会变,所以快速排序不是稳定排序算法。