希尔排序思路java_【转】希尔排序java实现

正文

【参考资料】

《算法(第4版)》         — — Robert Sedgewick, Kevin Wayne

在本篇笔记里,我从简单的插入排序,到希尔排序,中间的一系列算法,看起来就像是插入排序的“发展史”一般。这些点分别是:

直接插入排序(插入排序1.0版本)

基于插入排序的简单优化(插入排序1.1和1.2版本)

折半插入排序(插入排序2.0版本)

希尔排序(插入排序3.0版本)

直接插入排序(插入排序1.0)

直接插入排序的概念

将一个数组元素插入到已经有序的序列中, 并使得比它大的元素全部右移一位,如此对所有元素处理的排序方式, 叫做直接插入排序。

(文章的排序默认是左小右大的顺序)

单个元素的插入过程

对待插入元素来说, 它的左边是一堆已经有序但未来可能发生位置变动(右移)的元素。

这两点很重要: 已经有序和位置变动。

待排序元素左边序列已经有序, 这是正确插入的基础, 只有在这个前提下, 待排序元素才能在从左到右的比较和交换中插入正确的位置。

待排序元素的插入需要腾出空间, 这就需要使已有序序列中比它大的元素全部右移一位。

(下图中显示的是a[0]

bf5172c5295d20dc15b569fc38b78aae.png

9118349.html

上面的图示范告诉我们要做两件事: “将元素放入适当位置”,“将有序序列中大于元素的部分全部右移一位”, 具体应该怎么做呢?

我们是这样做的:

和相邻的左边元素的值比较大小

如果左边元素大于待排序元素,则交换两者的值,左边元素的值“右移”一位。

如果左边元素小于等于待排序元素,说明已经插入到“合适位置”了,一趟插入结束。

2ab164d459971773b09363ac7a1152c8.png

9118349.html

单个元素插入结束后,原来的有序序列的长度增加了一位, 当这个长度不断增长直到覆盖整个数组时,直接插入排序就完成了。

直接插入排序的代码

我们一般用两个嵌套的for循环来处理上面的逻辑, 在外部for循环中,设置变量 i 控制当前待插入元素的下标的移动;在内部for循环中,设置变量j用于控制待插入的值的比较和交换(左移到合适位置)

代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

/**

* @Author: HuWan Peng

* @Date Created in 23:16 2017/12/1

*/

public class InsertSort {

/**

* @description: 交换a[i]和a[j]的值

*/

private static void exch (int []a,int i,int j) {

int temp = a[i];

a[i] = a[j];

a[j] = temp;

}

/**

* @description: 插入排序

*/

public static void sort (int []a) {

int N = a.length;

for(int i=1;i

for(int j=i;j>0&&a[j]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值