算法分析与设计作业——
根号n段合并排序算法:
将数组划分为根号n个子数组,每个子数组有根号n个元素。然后递归地对分割后的子数组进行排序,最后将所得到的根号n个排好序的子数组合并排序。
public class Sort1 {
public static void main(String[] args) {
int[] a={88,183,522,374,57,847,96,8008,98,22,444,66};//数组
sort1(a,0,a.length-1);
for(int k:a){
System.out.print(k+",");
}
}
//合并
private static void merge(int[]a,int i,int n1,int j,int n2) {
int tmpi=i;
int k=i;
int[] p=new int[a.length];//临时数组
while(i<=n1&&j<=n2){
if(a[i]<a[j])
p[k++]=a[i++];
else
p[k++]=a[j++];
}
while(i<=n1)
p[k++]=a[i++];
while(j<=n2)
p[k++]=a[j++];
for(int o=tmpi;o<=n2;o++)
a[o]=p[o];
}
public static void sort1(int[] a,int left,int right){
if(left==right)
return;
int sqrt=(int)Math.sqrt(right-left+1);
for(int i=left,j=left; i<=right; i=j+1){
j=Math.min(i+sqrt-1,right);
sort1(a,i,j);
if(i!=left)
merge(a,left,i-1,i,j);
//跟这段之前的合并
}
}
}