最近复习了下插入排序,确切的说是直接插入排序,因为插入排序之中还有个高级算法shell排序,高级的暂不讨论。
直接插入排序的主要思路不难理解,百度了下,有个大神的回复就很清晰易懂:
From 百度知友ch_cityhunter:
1 5 7 3 1 6
把表分成两部分,前半部分已排序,后半部分未排序,我用|分开初始为 5 | 1 7 3 1 6
一次插入排序,把第一个1插入前边已排序部分,得
1 5 | 7 3 1 6
后边依次是
1 5 7 | 3 1 6
1 3 5 7 | 1 6
1 1 3 5 7 | 6
1 1 3 5 6 7 |
|
这个思路很容易理解吧,但代码实现却不是那么简单,平时习惯for循环,来个while,还真有点接受不了,感觉while太执着了,只要心中还有残念,就一直“不死不休”的坚持下去。
来个例子说明:
Index
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Value
|
72
|
6
|
57
|
88
|
60
|
42
|
83
|
73
|
48
|
85
|
第一步, 从数组的第二个数字(index=1)开始遍历:
拿出6放到一边(设置为temp),判断左边第一个元素值(index=0)是否大于它,72>6, 则将72放置到6的位置。
Index
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Value
|
72
|
72
|
57
|
88
|
60
|
42
|
83
|
73
|
48
|
85
|
索引前移,index = -1,break跳出。将temp值放入index+1, 就是0 这个位置。
Index
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Value
|
6
|
72
|
57
|
88
|
60
|
42
|
83
|
73
|
48
|
85
|
第二步,拿出index=2的元素temp=57,向左遍历。取index=1的元素与它比较,72>57,则72放置在57的位置:
Index
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Value
|
6
|
72
|
72
|
88
|
60
|
42
|
83
|
73
|
48
|
85
|
继续索引前移,index=0,6<57,遇到了比temp小的数值,循环停止。将temp放置到当前index+1的位置:
Index
|
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
Value
|
6
|
57
|
72
|
88
|
60
|
42
|
83
|
73
|
48
|
85
|
剩下的原理一样。取出当前循环中,索引指向的数值放入temp中, 向左迭代,遇到比自己大的数则大数右移, 遇到比自己小的数, 则temp入坑. 若遇不到小数,也就是说当前temp是最小数,此时的index=-1, 则break结束迭代. 代码实现如下:
public class MyInsertSort {
/**
* insert sort
*
* @param a
*/
public static void insertSort(int[] a) {
for (int j = 1; j < a.length; j++) {
int tmp = a[j];
int i = j - 1;
while (tmp < a[i]) {
a[i + 1] = a[i];
i--;
if (i == -1)
break;
}
a[i + 1] = tmp;
}
}
/**
* main()测试方法
*
* @param args
*/
public static void main(String[] args) {
int[] a = new int[]{72, 6, 57, 88, 60, 42, 83, 73, 48, 85};
insertSort(a);
for (int i : a) {
System.out.print(i + " ");
}
}
}
分享到:
相关推荐
此案例难度系数4,属于Scratch高级编程,插入排序相对而言比选择排序和冒泡排序理解起来要难一点,但是还是相对简单的排序,尤其是对少量元素排序的时候,效率较高;综合考查说话、随机数、无限循环(条件循环)、...
选择排序和冒泡排序想必大家都很熟悉,但插入排序一般新手却很难理解,插入排序的Java源代码
编写选择排序,插入排序,自顶向上合并排序,合并排序,快速排序,理解各排序算法的实现原理,加深对排序算法的理解。
冒泡排序、快速排序、简单插入排序、希尔排序、简单选择排序、堆叠排序六种数据结构必考的排序方式理解
由于插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找”操作可利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序(Binary Insertion Sort)。时间复杂度为O(n^2)。理解:依次将每个待...
用C++语言实现的几个常见算法,里面有注解,方便大家理解,简单易学,都可以正常编译运行。
直接插入排序 前面文章已经讲完了交换类排序,接下来开始学习插入类排序。顾名思义,所谓插入排序指我们会为每一个数据安排一个适合它的位置并将其插入,直到所有数据就位则排序完成。 直接插入法便是插入排序的典型...
理解插入排序算法-讲解
C语言程序设计-排序算法:理解和重点掌握选择法排序、冒泡法排序、插入法排序的思想 ⑴编写程序,对n个整数用冒泡法排序(从小到大或从大到小); ⑵编写程序,对n个整数用选择法排序(从小到大或从大到小); ⑶...
插入排序的优点在于实现简单,易于理解,且在数据规模较小时效率较高。然而,随着数据规模的增大,其时间复杂度达到O(n^2),因此在处理大数据集时效率较低。此外,插入排序是一种不稳定的排序算法,即相等的元素在...
插入排序
插入排序是一种简单但有效的排序算法,它将数组分成已排序部分和未排序部分,然后逐个将未排序部分的元素插入到已排序部分的合适位置,逐步构建有序数组。在这个教程中,我们将深入研究插入排序的原理,并提供一个...
该资源包括实用练习,让读者可以练习在Java中实现插入排序,并提供解决方案以帮助读者检查自己的工作并深入理解所学内容。 无论您是Java编程的初学者还是有经验的程序员,该资源都将为您提供有价值的指导和支持,...
在这份文档中,我用C语言实现了排序算法的多种方法,包括插入排序、选择排序、冒泡排序、希尔排序、归并排序、快速排序、桶排序和基数排序。这些算法可以帮助我们对数据进行有效的排序和整理,以便更好地处理和分析...
Java代码-排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序中部分排序以及算法-贪心法,大家可以将源码下载下来进行学习,附带着注释和解释,有不理解的可以找博主一起探讨,共同...
插入排序的实现,数据结构,含有注释(不过仅是新人自己理解 )
主要介绍了JS插入排序简单理解与实现方法,结合实例形式分析了JavaScript插入排序基本原理、实现方法及相关操作注意事项,需要的朋友可以参考下
不同于常规从前插入,此程序选择从后开始,适合初学者来以此学习插入排序的原理以及代码实现,有助于初学c语言的初学者更好的理解排序的原理,并引发初学者的兴趣。
该源码使用Qt可以可视化展示插入排序算法实现效果,通过可视化的方式和实时显示算法比较和移动的次数,方便初学者理解插入排序算法的时间复杂度和原理