今天要说的是:插入排序

插入排序 顾名思义,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

如下文中,您有别的见解,欢迎评论指正,深海谢过诸位灵长类

简单插入排序

依据深海的理解举一个简单的例子:

未排序序列是:[5,9,8,4,2]

已排序序列是:暂时没有.

第一次执行插入: 将5拿出来  放到已排序序列

执行后:

未排序序列是:[9,8,4,2]

已排序序列是:[5]

第二次执行插入: 将9拿出来, 从已排序序列从后向前扫描,发现对应的位置在5的后面

执行后:

未排序序列是:[8,4,2]

已排序序列是:[5,9]

第二次执行插入: 将8拿出来, 从已排序序列从后向前扫描,发现对应的位置在5和9的中间

执行后:

未排序序列是:[4,2]

已排序序列是:[5,8,9]

以此类推,最终排序完成

public int[] Test() {
int[] array={5,9,8,4,2};
int i,j,temp; //temp 正在执行插入的数
for(i=1;i<array.length;i++) {
temp=array[i];
for(j=i-1;j>=0;j--) {
if (temp > array[j]) { //顺序正确,停止探索
break;
}else{//元素后移
array[j+1] = array[j];
}
}
array[j+1]=temp;
}
return array;
}

希尔排序

希尔排序呢就是简单插入排序的升级版,

原理如下:

1.在逻辑的层面,将数组分成若干小数组,然后排序

2.之后将分组的条件更改,分组跨度变小,然后再排序

3.循环往复,直到跨度降到1时,排序整个数组.

该排序因为分组原因,相同大小的数可能顺序颠倒.所以该排序方式为不稳定排序

public static void shellSort(int[] arr) {
for(int gap=arr.length/2; gap>0; gap/=2) { /*步长逐渐减小*/
for(int i=gap; i<arr.length; i++) { /*在同一步长内*/
//同一步长内排序方式是插入排序
int temp = arr[i], j; //待排元素
//j-gap代表有序数组中最大数的下标,j-pag表示有序数组的前一个元素,减pag是减去偏移量就是步长
for(j=i; j>=gap && temp<arr[j-gap]; j-=gap)
arr[j] = arr[j-gap]; //原有序数组最大的后移一位
arr[j] = temp; //找到了合适的位置插入
}
}
}