希尔排序
先将数据区域化,再通过插入排序进行排序,对处理多数据可以省很多时间;
如下列排序,可以减少约五倍的时间。
先生成随机数‘a’-'b',再进行排序。
public class shell {
public static void main(String [] args) {
char [] array = new char [1000];
/*
* 生成随机数
*/
for(int i = 0;i < 1000;i ++) {
array[i] = (char) ('a'+(int)(Math.random()*26));
}
int flag = 0;/*确定运行次数*/
int N = array.length;
int h = 1;
while(h < N/3)
h = 3*h + 1;
/*通过N的值将h的值设为1,4,13,40,121.....*/
while(h >= 1) {
/*通过比较间隔h的字母使其部分有序*/
for(int i = h; i < N; i++) {
for(int j = i; j >= h && less(array[j],array[j-h]); j--) {
exch(array,j,j-h);
flag ++;
}
}
h = h / 3;
/*将h的值不断缩小到一并依次使用*/
}
for(int i = 0;i < array.length; i++) {
System.out.print(array[i]+" ");
}
System.out.print("\n"+flag);
}
/*
比较两个字符的大小
*/
public static boolean less(Comparable v,Comparable w) {
return v.compareTo(w)<0;
}
/*
* 交换两个字符
*/
public static void exch(char[] array,int i,int j) {
char t = array[i];
array[i] = array[j];
array[j] = t;
}
}