思想:
希尔排序把记录按下标的一定增量分组,对每组使用直接排序算法排序;
随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
//希尔交换排序
public class ShellSort {
public static void main(String[] args) {
// int[]arr={8,9,1,7,2,3,5,4,6,0};
int[] arr = new int[80000];
for (int i = 0; i < 80000; i++) {
arr[i]=(int)(Math.random()*8000000);
}
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss");
String format = simpleDateFormat.format(date);
System.out.println("排序前的时间是:"+format);
shellSort(arr);
Date date1 = new Date();
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM--dd HH:mm:ss");
String format1 = simpleDateFormat.format(date1);
System.out.println("排序前的时间是:"+format1);;
}
public static void shellSort(int[]arr){
int temp=0;
int count=0;
//根据前面的分析,使用循环处理
for (int gap=arr.length/2;gap>0;gap/=2){
//第gap轮排序,将个数据分成了gap组
for (int i = gap; i < arr.length; i++) {
//遍历各组中所有的元素,共gap组,每组两个元素,步长为gap
for (int j = i-gap; j >=0; j-=gap) {
//如果当前元素大于加上步长后的那个元素,说明交换
if (arr[j]>arr[j+gap]){
temp=arr[j];
arr[j]=arr[j+gap];
arr[j+gap]=temp;
}else {
break;
}
}
}
// System.out.println("希尔排序第"+(count++)+"轮\n"+Arrays.toString(arr));
}
/* //第一轮排序,将10个数据分成了5组
for (int i = 5; i < arr.length; i++) {
//遍历各组中所有的元素,共5组,每组两个元素,步长为5
for (int j = i-5; j >=0; j-=5) {
//如果当前元素大于加上步长后的那个元素,说明交换
if (arr[j]>arr[j+5]){
temp=arr[j];
arr[j]=arr[j+5];
arr[j+5]=temp;
}
}
}
System.out.println("希尔排序第一轮\n"+ Arrays.toString(arr));
for (int i = 2; i < arr.length; i++) {
//遍历各组中所有的元素,共2组,每组两个元素,步长为2
for (int j = i-2; j >=0; j-=2) {
//如果当前元素大于加上步长后的那个元素,说明交换
if (arr[j]>arr[j+2]){
temp=arr[j];
arr[j]=arr[j+2];
arr[j+2]=temp;
}
}
}
System.out.println("希尔排序第二轮\n"+ Arrays.toString(arr));
for (int i = 1; i < arr.length; i++) {
//遍历各组中所有的元素,共1组,每组两个元素,步长为1
for (int j = i-1; j >=0; j-=1) {
//如果当前元素大于加上步长后的那个元素,说明交换
if (arr[j]>arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
System.out.println("希尔排序第三轮\n"+ Arrays.toString(arr));*/
}
}
排序前的时间是:2022-02--07 19:19:05
排序前的时间是:2022-02--07 19:19:05