码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序算法

时间:2019-09-29 11:18:31      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:ring   nbsp   元素   src   img   传统   http   static   quick   

快排的时间复杂度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]; } }

 

快速排序算法

标签:ring   nbsp   元素   src   img   传统   http   static   quick   

原文地址:https://www.cnblogs.com/bowenqianngzhibushiwo/p/11606663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!