您的位置:首页 > 编程语言 > Java开发

八大排序——快速排序

2018-01-15 19:37 183 查看

快速排序

基本理解

快速排序首先挑出一个基准数字,在序列中分别从两头向中间遍历,将比基准数字大的数换到基准数字后面,比基准数字小的数换到基准数字前面,一趟快排下来,基准数字的位置就可以确定了,然后再将基准数字左半部分和右半部分分别再次进行快排……直到有序。

大致过程如下:

























每次快排结束的标志为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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序 快速排序 java