快速排序算法

Posted bowenqianngzhibushiwo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序算法相关的知识,希望对你有一定的参考价值。

快排的时间复杂度O(nlogn)-O(N^2),空间复杂度为O(long2n)-O(N)

技术图片

传统的快排与优化的快排的优化之处在于,传统的左边每次都保存着小于等于target即x的数值,包含着x,下次对左边的再次进行快排,还是要比较x,

优化的把 等于x放在中间,减少了重复元素的比较次数。

当origin[cur]>origin[more] 的时候,将origin[cur]和origin[more-1]交换,cur不变,more--。

当origin[cur]=origin[more] 的时候,cur++;

当origin[cur]<origin[more] 的时候,将origin[cur]和origin[less+1]交换,cur++,less++。

当cur和more碰撞的时候,交换最后一位和当前cur指向的元素。第一次排序就完成了。

使用数组int ] p=new int[2],保存中间的等于区域的前后指针,即less+1和cur.

以上的more--和less++代表着 大于目标的区域的扩大,和小于目标的区域的扩大。

实现代码如下

public class quick {
    public static void main(String[] args){

    }

    public static void quicksort(int[] origin,int L,int R){
        int[] p=quickk(origin, L, R);
//int[] p=quickk(origin,(int)(L+Math.Random()*(R-L+1)),R);//随机快排 quicksort(origin,L,p[
0]-1);//小于区域 quicksort(origin,p[1]+1,R);//大于区域 } public static int[] quickk(int[] origin,int L,int R){ int less=L-1;//小区 int more=R;//大区 while(L<more){ if(origin[L]>origin[R]){ swap(origin,L,--more); }else if(origin[L]<origin[R]){ swap(origin,++less,L++); }else{ L++; } } swap(origin,R,more);//最后一次才交换target return new int[]{less+1,more}; } public static void swap(int[] a,int i,int j){ a[i]=a[i]^a[j]; a[j]=a[i]^a[j]; a[i]=a[i]^a[j]; } }

 

以上是关于快速排序算法的主要内容,如果未能解决你的问题,请参考以下文章

一行Python代码搞定快速排序算法

排序算法 | 快速排序(含C++/Python代码实现)

交换排序(冒泡排序快速排序的算法思想及代码实现)

快速排序/快速选择算法

快速排序算法详解及代码实现

排序算法——快速排序的图解代码实现以及时间复杂度分析