插入排序的顺序
插入排序的顺序就如同抓扑克牌
刚开始你抓的是1
然后你即将迎来第一次插入排序
你抓了张3发现3>1,所以3就排在了1的后边
然后第2次插入排序你抓了张2
发现2<3,所以需要将2插入到3的前边就是这样
如此反复...
你会发现5个数需要4次插入排序
代码
package 排序;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-31-17-47
*/
public class 插入排序 {
public static void main(String[] args) {
int[] ints = new int[]{2,1,0,-1,1};
insertSort(ints);
for(int anInt:ints){
System.out.print(anInt+" ");
}
}
public static void insertSort(int[] arr){
//i从1开始也是插入排序的次数为arr.length-1
for(int i=1;i<arr.length;i++){
int insertIndex = i;//arr[i]待插入的下标:inserIndex
int insertValue = arr[i];//待插入的值
//内层的while循环是找arr[i]待插入的位置,以及把arr[i]前面的数往后挪
while (insertIndex > 0 && insertValue<arr[insertIndex-1])
{
//将arr[i]前面的值往后挪(如过前面的数>arr[i])
arr[insertIndex] = arr[insertIndex-1];
insertIndex--;
}
//此时就已经确定了arr[i]的下标的位置insertIndex
arr[insertIndex] = insertValue;
}
}
}
运行结果
-1 0 1 1 2
希尔排序和插入排序很相似,插入排序就是步长为1的插入排序,而希尔排序也只是步长从大到小的区别
希尔排序代码
package 排序;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-31-18-33
* 比插入排序效率更好一点
*/
public class 希尔排序 {
public static void main(String[] args) {
int[] ints = new int[]{2,1,-1,0,4};
shellSort(ints);
for(int anInt:ints){
System.out.print(anInt+" ");
}
}
//希尔排序
public static void shellSort(int[] arr){
//步长 gap
for (int gap = arr.length/2; gap>0 ; gap/=2) {
for (int i = gap; i < arr.length; i++) {
//插入式 间隔为gap的插入排序
int insertIndex = i;
int insertValue = arr[i];
while (insertIndex-gap>=0 && insertValue<arr[insertIndex-gap]){
arr[insertIndex] = arr[insertIndex-gap];//大的往后交换
insertIndex-=gap;
}
//insertIndex就是insertValue该插入到的下标
arr[insertIndex]=insertValue;
}
}
}
}
运行结果
-1 0 1 2 4