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++;
}
}
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
- Arrays.sort方法的实现过程,以字符数组为例
- 由多个Object(以Teacher为例)对象所形成的数组可以使用Arrays.sort方法进行排序(编号由低到高排序)。
- 重写Arrays中的sort方法,实现数组的降序排序
- 数组的排序,方法Arrays.sort(你创建的数组)
- 数组排序 java.util.Arrays类的sort方法
- Arrays的sort方法分析
- 最好玩儿的补字符方法,以VB为例
- 以数组为参数的方法
- 数组的创建、数组的复制、Arrays中sort/binarySearch方法
- 数组排序Arrays.sort
- Arrays.sort数组排序
- Arrays和Collections的sort方法
- Arrays和Collections的sort方法
- Arrays和Collections的sort方法
- Java中Arrays的sort方法
- Arrays和Collections的sort方法
- Arrays.sort()方法的源码分析
- java中数组排序arrays.sort方法应用
- poj 2486 树形dp(给定步数 走一棵树,获得的节点值总和的最大值)
- 数据结构 Huffman编码实现
- 最小生成树(prim算法)模板
- 无bug版本的生物信息学c++工具包 BALL 1.1.1
- jz2440开发板-软件环境的构建
- Arrays.sort方法的实现过程,以字符数组为例
- #1 Python列表
- Activity的四种LaunchMode详解
- Setup Factory使用——安装包进行安装前检查系统是否安装了其它相关系统
- I
- 4.28 使用Maven搭建SSM项目(一)--秒杀系统api之DAO层
- actionlib
- [manacher 后缀自动机 || 回文自动机] BZOJ 3676 [Apio2014]回文串
- 安卓新手作死记录