插入排序与希尔排序
Posted 躲在灌木丛里写博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序与希尔排序相关的知识,希望对你有一定的参考价值。
插入排序:
思路:
将数组看成有序和无序两部分
把无序的按顺序插入有序的部分
此处使用位移法,交换法用时长
代码实现:
//插入排序方法
public void insertSort() {
//外层循环从1开始
for (int i = 1; i < ary.length; i++) {
//保存数组无序部分的元素,内层循环结束后与有序部分交换
int val=ary[i];
int num=i-1;
while (num>=0&&val<ary[num]) {
//通过循环找到插入位置,再进行向后位移使无序变为有序
ary[num+1]=ary[num];
num--;
}
ary[num+1]=val;
}
}
希尔排序:
思路:
将数组分成前后两部分
前后部分相比前半部分都小于后半部分
一次缩小中间值直到中间值为零
代码实现:
//希尔排序方法
public void shellSort() {
//gap:中间值每轮减半
for (int gap =ary.length/2; gap>0; gap/=2) {
for (int i = gap; i < ary.length; i++) {
//后面要改变j的值但i值不能改变所以新建一个临时变量j代替i
int j=i;
//j:数组后半部分元素的下标
int val=ary[j];
if (ary[j]<ary[j-gap]) {
//j-gap:数组前半部分元素的下标
//此处用位移法
while (j-gap>=0&&val<ary[j-gap]) {
ary[j]=ary[j-gap];
j-=gap;
}
ary[j]=val;
}
}
}
以上是关于插入排序与希尔排序的主要内容,如果未能解决你的问题,请参考以下文章
插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)