`

插入排序之我的理解

 
阅读更多
最近复习了下插入排序,确切的说是直接插入排序,因为插入排序之中还有个高级算法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 = -1break跳出。将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=06<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 + " ");
		}
	}
}

 

分享到:
评论

相关推荐

    C语言实现的插入排序

    首先,理解插入排序的基本思想至关重要。在插入排序中,我们假设数组分为两部分:已排序部分和未排序部分。初始时,已排序部分只有一个元素(数组的第一个元素)。接下来,每次从未排序部分取出一个元素,与已排序...

    Scratch插入排序源代码 少儿编程 Scratch排序算法 Scratch高阶编程

    此案例难度系数4,属于Scratch高级编程,插入排序相对而言比选择排序和冒泡排序理解起来要难一点,但是还是相对简单的排序,尤其是对少量元素排序的时候,效率较高;综合考查说话、随机数、无限循环(条件循环)、...

    使用分治法的插入排序

    然而,插入排序是其他高级排序算法如希尔排序和快速排序的基础,对于理解排序算法的原理具有重要意义。 总的来说,插入排序是一种简单而直观的排序算法,通过分治思想的类比,我们可以更好地理解和实现它。在学习和...

    插入排序Java代码

    ### 插入排序Java代码详解 #### 一、插入排序简介 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在...对于初学者来说,理解插入排序的实现逻辑有助于掌握更复杂的排序算法。

    合并排序,插入排序,希尔排序,快速排序,冒泡排序,桶排序的C语言实现

    插入排序是最简单的排序算法之一,它的工作原理类似于手动整理扑克牌。遍历数组,将每个元素插入到已排序的部分,保持已排序部分的顺序。对于小规模或部分有序的数据,插入排序效率较高。其平均和最坏情况下的时间...

    大学生实验排序 泡泡排序 直接插入排序 折半插入排序 希尔排序 直接选择排序 统计时间 比较次数和交换次数 保存为txt文件

    本实验涉及了六种常见的排序算法:泡泡排序、直接插入排序、折半插入排序、希尔排序、直接选择排序,并且对每种排序算法进行了性能分析,包括统计执行时间、比较次数和交换次数。这些数据被保存在TXT文件中,便于...

    插入排序(排序算法的入门方法)

    插入排序,作为排序算法中的入门方法,具有简单易懂、实现方便等特点,非常适合初学者学习和理解排序的基础原理。在数据结构与算法的学习过程中,了解和掌握插入排序的实现原理和特点,对于后续深入理解更复杂的排序...

    快速和插入排序

    快速排序和插入排序是两种广泛使用的排序算法,它们在计算机科学和编程中有着重要的地位,尤其是在数据处理和算法分析方面。下面将详细讲解这两种排序算法的原理、Java实现及其特点。 **快速排序** 快速排序是一种...

    C++实现插入排序

    根据给定的文件信息,我们可以总结出以下关于“C++实现插入排序”的相关知识点: ### 一、插入排序算法概述 插入排序(Insertion Sort)是一种简单直观的比较排序算法。它的工作原理是通过构建有序序列,对于未...

    c++ 选择排序 插入排序 快速排序

    选择排序、插入排序和快速排序都是经典的排序算法,各有其特点和适用场景。接下来,我们将详细探讨这三个排序算法。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法。它的基本思想是在未...

    数据结构 直接插入排序

    ### 数据结构之直接插入排序详解 #### 一、引言 在计算机科学中,排序算法是数据处理中不可或缺的一部分,而直接插入排序是一种简单直观的排序方法。它的工作原理类似于我们手动排序一组卡片的方式——每次从未...

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...

    六种内部排序算法比较:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序。

    本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...

    c++实现多种线性表排序的算法(插入排序,希尔,冒泡,快速,堆排序,归并排序)

    本篇将详细阐述标题和描述中提到的几种线性表排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、堆排序以及归并排序。 1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个...

    数据结构算法源代码(插入排序和选择排序)

    在本文中,我们将深入探讨两种基础且重要的排序算法——插入排序和选择排序。这两种排序算法在数据结构和算法的学习中占据着核心地位,因为它们帮助初学者理解排序的基本原理。 首先,我们来看**插入排序...

    排序:插入排序,选择排序,基数排序,冒泡排序

    在本文中,我们将深入探讨四种经典的排序算法:插入排序、选择排序、基数排序和冒泡排序,以及它们在C++语言中的实现。 **插入排序(Insertion Sort)** 插入排序是一种简单直观的排序算法,它的工作原理类似于我们...

    数据结构 折半插入排序

    ### 数据结构之折半插入排序 #### 知识点概览 1. **折半插入排序的基本概念** 2. **折半插入排序算法原理** 3. **折半插入排序的时间复杂度分析** 4. **折半插入排序的空间复杂度分析** 5. **折半插入排序与普通...

    二分法直接插入排序算法

    通过深入理解二分法直接插入排序的原理,并结合实际的代码实现,可以更好地掌握这种优化后的排序算法,提高算法的运行效率。在编程实践中,根据具体场景选择合适的排序算法是非常重要的,二分法直接插入排序提供了一...

    7大排序算法实现程序(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)

    本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...

    冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序源码实现

    以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...

Global site tag (gtag.js) - Google Analytics