Arrays.sort方法的实现过程,以字符数组为例

来源:互联网 发布:spyder导入tensorflow 编辑:程序博客网 时间:2024/05/02 02:09
public static void sort(char[] a){
sort1(a,0,a.length);
}
public static void sort1(char[] x,int off,int len){//off和len控制排序的范围
//如果字符长度小,用直接插入排序。升序
if(len<7){
for(int i=off;i<off+len;i++){
for(int j=i+1;j>off&&x[j]<x[j-1];j--){
swap(x,j,j-1);
}
}
return;
}
/*
* 当待排序的数组中的元素个数大于 或等于7 时,采用快速排序 。 
* 选取一个划分元,V
较好的选择了划分元(基准元素)。能够将数组分成大致两个相等的部分,避免出现最坏的情况。例如当数组有序的的情况下,
* 选择第一个元素作为划分元,将使得算法的时间复杂度达到O(n^2).
*/
int m=off+(len>>1);//>>1相当于除以2,数组长度大于7的时候,取中间元素
if(len>7){
int l=off;
int n=off+len-1;
if(len>40){//均匀取9个元素
int s = len/8;
l = med3(x, l,  l+s, l+2*s);
m = med3(x, m-s,m,   m+s);
n = med3(x, n-2*s, n-s, n);
}
m = med3(x, l, m, n);
}
char v=x[m];
int a=off,b=a,c=off+len-1,d=c;
while(true){
//把与枢轴相同的数放到两边
//a,d分别控制头尾的位置,b,c进行移动查找
while(b<=c&&x[b]<=v){//在小于v的部分找
if(x[b]==v)
swap(x,a++,b);//有与枢轴相同的左边
b++;
}
while(c>=b&&x[c]>=v){
if(x[c]==v)
swap(x,d--,c);
c--;
}
if(b>c)
break;
swap(x,b++,c--);//把找到的左边大于v的和右边小于v的交换位置
}
//接下来把左右两头与枢轴相等的元素交换到中间
int s;
int n=off+len;
s=Math.min(a-off, b-a);
vecswap(x,off,b-s,s);
s=Math.min(d-c, n-d-1);
vecswap(x,b,n-s,s);
//递归调用子序列
if ((s = b-a) > 1)
   sort1(x, off, s);
if ((s = d-c) > 1)
   sort1(x, n-s, s);
}
public static void swap(char[] a,int i,int j){
char temp=a[i];
a[i]=a[j];
a[j]=temp;
}
//求三个数中的中间大小的数
public static int med3(char[] x,int a,int b,int c){
return(x[a]<x[b]?
(x[b]<x[c]?x[b]:x[a]<x[c]?c:a):
(x[b]>x[c]?x[b]:x[a]>x[c]?c:a));
}
//批量交换,把a位置后的n个元素与b位置后的n个元素交换
public static void vecswap(char[] x,int a,int b,int n){
for(int i=0;i<n;i++){
swap(x,a,b);
a++;b++;

}
}
0 0
原创粉丝点击