插入排序的问题🎈:
arr={2,3,4,5,6,0,9,7,8};
当0作为插入元素的时候,其待插入下标与原下标相差很远,需要进行多次比较和移动。
希尔排序则是先将下标相差一定距离gap的元素分为一组,进行插入排序;再逐渐将距离gap缩小为1。
package DataStructure;
import java.util.List;
import java.util.ArrayList;
/**
* Created with IntelliJ IDEA.
* Description:
* User: 86178
* Date: 2024-02-27
* Time: 7:14
*/
public class Sort {
public static void main(String[] args) {
int[] arr={ 8,9,1,7,2,3,5,4,6,0 };
System.out.println("原数组如下");
for (int i : arr) {
System.out.print(i+" ");
}
ShellSort(arr);
System.out.println("\nShell排序之后的数组");
for (int i : arr) {
System.out.print(i+" ");
}
}
public static void InsertSort(int[] arr){
//todo 将一个数组分为有序和无序两个部分
for(int i=1;i<arr.length;i++){
int indexVal=arr[i];
int index=i-1;//todo 假定插入位置是它的前一个位置
while(index>=0 && indexVal<=arr[index]){
arr[index+1]=arr[index];
index--;
//todo 不停的进行比较 从后往前 大的元素后退
//todo 相比较而言省去了一些交换的操作
}
//当退出while循环的时候 index到达待插入位置的前一个位置
arr[index+1]=indexVal;
System.out.printf("\n第%d遍排序后 ",i);
for (int i1 : arr) {
System.out.print(i1+" ");
}
}
}
public static void ShellSort(int[] arr){
//todo 希尔排序的逐步推导
//第一轮 将十个数据 分为五组
int gap= arr.length/2;
while(gap>=1) {
for (int i = gap; i < arr.length; i++) {
int indexVal = arr[i];
int index = i - gap;
while (index >= 0 && indexVal <= arr[index]) {
arr[index + gap] = arr[index];
index -= gap;
}
arr[index + gap] = indexVal;
}
gap/=2;
}
//第二轮
/*gap=gap/2;
for(int i=gap;i<arr.length;i++){
int indexVal=arr[i];
int index=i-gap;
while(index>=0 && indexVal<=arr[index]){
arr[index+gap]=arr[index];
index-=gap;
}
arr[index+gap]=indexVal;
}
//第三轮
gap=gap/2;
System.out.println(gap);
//todo 此时 gap=1 进行最后一次插入排序
for(int i=gap;i<arr.length;i++){
int indexVal=arr[i];
int index=i-gap;
while(index>=0 && indexVal<=arr[index]){
arr[index+gap]=arr[index];
index-=gap;
}
arr[index+gap]=indexVal;
}*/
}
}