八大排序——快速排序
程序员文章站
2022-06-18 10:34:15
...
快速排序
基本理解
快速排序首先挑出一个基准数字,在序列中分别从两头向中间遍历,将比基准数字大的数换到基准数字后面,比基准数字小的数换到基准数字前面,一趟快排下来,基准数字的位置就可以确定了,然后再将基准数字左半部分和右半部分分别再次进行快排……直到有序。
大致过程如下:
每次快排结束的标志为high和low指向同一数字,(但此时还是需要在比较一下这个数字和基准数字的大小,进行交换),一次快排完毕之后,将基准数的左边右边分为两部分再次进行,以此循环,直到基准数字的某一边剩下1个或者0个数字时停止。
时空复杂度
时间复杂度O(nlog₂n):每次快排需要将当前序列遍历一遍,时间复杂度为n;一共需要log₂n次快排,所以时间复杂度为O(nlog₂n)。
空间复杂度O(log₂n):在进行快速排序时使用了递归来一层一层进行排序,占用内存最多的时刻是最后一趟排序,所占空间大小为log₂n。
另外快速排序是不稳定的排序。
最好最坏情况
快速排序的最好情况是随机分布的无序序列(越随机越好越无序越好);最坏情况是有序序列。
无论是最好情况还是最坏情况,快速排序的时间复杂度都为O(nlog₂n)。
代码实现(JAVA)
public static void quickSort(int[]nums,int begain, int length){
//当所要排序的数组只剩下一个数或没有数时返回
if( length-begain == 0 || length-begain == 1)
return;
int standar = begain;//基准数
int low = begain+1;
int high = length-1;
while(high!=low){//停止一趟的比较交换
//high从后往前找比standar小的数字进行交换
while(high>low)//当high==low时停止 也就说明一趟结束
if(nums[high]<nums[standar]){
swap(nums,high,standar);
standar = high;
break;//找到之后跳出
}else
high--;
//low从前往后找比standar大的数字进行交换
while(low<high)
if(nums[low]>nums[standar]){
swap(nums,low,standar);
standar = low;
break;
}else
low++;
}
//比较high=low时的数字和基准数的大小进行交换
if(nums[low]<nums[standar])
swap(nums,low,standar);
quickSort(nums,begain,standar);
quickSort(nums,standar+1,length);
}