2025-01-16 希尔排序

This commit is contained in:
liangjinglin 2025-01-16 16:56:23 +08:00
parent b1758784c7
commit 4bbb9ec2de

View File

@ -0,0 +1,64 @@
package SortAlgori;
public class ShellSort {
private int[] arr;
private int gap;
public ShellSort(int[] arr){
this.arr = arr;
this.gap = arr.length;
}
private void sort(){
while(true){
// 每次步长为原来步长的一半初始的步长为排序数组长度的一半
gap = gap/2;
// 分组进行插入排序
for (int i = gap; i <arr.length; i++){
// 获取本轮需要插入的数并初始化一个下标为排序数组的最后一个下标
int temp = arr[i];
int index = i-gap;
// 当下标小于0就意味着已经完成本轮找位置的过程
// 如果当前插入的数小于下标指向的数,需要将当前下标数往后移动移位gap并且下标要继续往前移动gap位
// 直到下标小于0或者当前插入数大于下标位置的数
while (index >=0 && temp < arr[index]){
arr[index+gap] = arr[index];
index -= gap;
}
//将当前数插入到下标+gap的位置
arr[index+gap] = temp;
}
if (gap == 1){
break;
}
}
}
public void show(){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = new int[50000];
System.out.println("排序前的序列:");
for(int i=0; i<50000; i++){
arr[i] = (int)(Math.random()*100000);
System.out.print(arr[i] + " ");
}
// int[] arr = new int[]{8,9,1,7,2,3,5,4,6,0};
System.out.println();
ShellSort shellSort = new ShellSort(arr);
long startTime = System.currentTimeMillis();
shellSort.sort();
long endTime = System.currentTimeMillis();
System.out.println("排序后的序列:");
shellSort.show();
System.out.println("排序所花费的时间:" + (endTime - startTime) + "ms");
}
}