标签: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