常用的排序算法分为
- 交换排序 ( 冒泡排序 / 快速排序 ) https://blog.csdn.net/qq_39731011/article/details/95204290
- 插入排序 ( 简单插入排序 / 希尔排序 ) https://blog.csdn.net/qq_39731011/article/details/95342246
- 选择排序 ( 简单选择排序 / 堆排序 ) https://blog.csdn.net/qq_39731011/article/details/95457842
- 归并排序 https://blog.csdn.net/qq_39731011/article/details/95614787
- 基数排序 ( 桶排序 ) https://blog.csdn.net/qq_39731011/article/details/95995693
今天要说的是:插入排序
插入排序 顾名思义,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
如下文中,您有别的见解,欢迎评论指正,深海谢过诸位灵长类
简单插入排序
依据深海的理解举一个简单的例子:
未排序序列是:[5,9,8,4,2]
已排序序列是:暂时没有.
第一次执行插入: 将5拿出来 放到已排序序列
执行后:
未排序序列是:[9,8,4,2]
已排序序列是:[5]
第二次执行插入: 将9拿出来, 从已排序序列从后向前扫描,发现对应的位置在5的后面
扫描二维码关注公众号,回复:
8487038 查看本文章
执行后:
未排序序列是:[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; //找到了合适的位置插入
}
}
}