最近复习了下插入排序,确切的说是直接插入排序,因为插入排序之中还有个高级算法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代码详解 #### 一、插入排序简介 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在...对于初学者来说,理解插入排序的实现逻辑有助于掌握更复杂的排序算法。
插入排序是最简单的排序算法之一,它的工作原理类似于手动整理扑克牌。遍历数组,将每个元素插入到已排序的部分,保持已排序部分的顺序。对于小规模或部分有序的数据,插入排序效率较高。其平均和最坏情况下的时间...
本实验涉及了六种常见的排序算法:泡泡排序、直接插入排序、折半插入排序、希尔排序、直接选择排序,并且对每种排序算法进行了性能分析,包括统计执行时间、比较次数和交换次数。这些数据被保存在TXT文件中,便于...
插入排序,作为排序算法中的入门方法,具有简单易懂、实现方便等特点,非常适合初学者学习和理解排序的基础原理。在数据结构与算法的学习过程中,了解和掌握插入排序的实现原理和特点,对于后续深入理解更复杂的排序...
快速排序和插入排序是两种广泛使用的排序算法,它们在计算机科学和编程中有着重要的地位,尤其是在数据处理和算法分析方面。下面将详细讲解这两种排序算法的原理、Java实现及其特点。 **快速排序** 快速排序是一种...
根据给定的文件信息,我们可以总结出以下关于“C++实现插入排序”的相关知识点: ### 一、插入排序算法概述 插入排序(Insertion Sort)是一种简单直观的比较排序算法。它的工作原理是通过构建有序序列,对于未...
选择排序、插入排序和快速排序都是经典的排序算法,各有其特点和适用场景。接下来,我们将详细探讨这三个排序算法。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法。它的基本思想是在未...
### 数据结构之直接插入排序详解 #### 一、引言 在计算机科学中,排序算法是数据处理中不可或缺的一部分,而直接插入排序是一种简单直观的排序方法。它的工作原理类似于我们手动排序一组卡片的方式——每次从未...
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
本篇将详细阐述标题和描述中提到的几种线性表排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、堆排序以及归并排序。 1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个...
在本文中,我们将深入探讨两种基础且重要的排序算法——插入排序和选择排序。这两种排序算法在数据结构和算法的学习中占据着核心地位,因为它们帮助初学者理解排序的基本原理。 首先,我们来看**插入排序...
在本文中,我们将深入探讨四种经典的排序算法:插入排序、选择排序、基数排序和冒泡排序,以及它们在C++语言中的实现。 **插入排序(Insertion Sort)** 插入排序是一种简单直观的排序算法,它的工作原理类似于我们...
### 数据结构之折半插入排序 #### 知识点概览 1. **折半插入排序的基本概念** 2. **折半插入排序算法原理** 3. **折半插入排序的时间复杂度分析** 4. **折半插入排序的空间复杂度分析** 5. **折半插入排序与普通...
通过深入理解二分法直接插入排序的原理,并结合实际的代码实现,可以更好地掌握这种优化后的排序算法,提高算法的运行效率。在编程实践中,根据具体场景选择合适的排序算法是非常重要的,二分法直接插入排序提供了一...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...