插入排序的算法一句话可以描述:
a[0].....a[n-1] n个元素进行排序,假设a[0]...a[i-1]是一个有序序列,将a[i]插入到这个有序序列的适当位置中。
一、常规
最小的有序序列即为a[0],i从1开始到n-1
第一种是每次a[i]与有序序列a[0]...a[i-1]中的元素(设为a[j])比较,从左往右,如果第一次碰到a[i]<a[j],那么记录这个j的位置并break循环,让a[j]到a[i-1]的每个元素后移,最后将a[j]这个元素替换为a[i]的值(需要事先保存好a[i]的值,因为在后移过程中a[i]的值会被覆盖)
for (int i = 1; i < array.length; i++) { int m = -1;//或m = i那么下面的if(m >= 0)改成if(m < i) for (int j = 0; j <= i - 1; j++) { // 找要插入的位置 if (array[i] < array[j]) { m = j; break; } } if (m >= 0) { // 将比array[i]大的向后移 int temp = array[i]; for (int k = i - 1; k >= m; k--) { array[k + 1] = array[k]; } array[m] = temp; } }
或
第二种是每次a[i]与有序序列a[0]...a[i-1]中的元素(设为a[j])比较,从右往左,如果a[i]<a[j],那么记录这个j的位置并继续循环(因为左边可能还有比a[i]大的元素),让a[j]到a[i-1]的每个元素后移,最后将a[j]这个元素替换为a[i]的值(需要事先保存好a[i]的值,因为在后移过程中a[i]的值会被覆盖)
for (int i = 1; i < array.length; i++) { int m = i; for (int j = i - 1; j >= 0 && array[i] < array[j]; j--) { m = j; } if (m < i) { // 将比array[i]大的向后移 int temp = array[i]; for (int k = i - 1; k >= m; k--) { array[k + 1] = array[k]; } array[m] = temp; } }
或再精简一点,其中for (j = i - 1; j >= 0 && array[i] < array[j]; j--);这句代码也可以用另一种方式表达
for (j = i - 1; j >= 0; j--){if(array[i] > array[j])break;},程序非常灵活的,需要随机应变
for (int i = 1, j; i < array.length; i++) { for (j = i - 1; j >= 0 && array[i] < array[j]; j--); if (j < i) { int temp = array[i]; for (int k = i - 1; k >= j + 1; k--) { array[k + 1] = array[k]; } array[j + 1] = temp; } }
二、将a[i]元素插入到a[0]...a[i-1]有序序列中,a[i]在与a[j],j∈{0..i-1}进行比较大小时,同时进行移位操作
array[i]插入有序子序列array[0]...array[i-1]时,设j∈{0..i-1},若array[i]<array[j],则将array[j+1]替换为array[j] (表示array[j]后移一位),循环直到array[i]>array[j]或循环结束。将array[j+1]的值替换为temp (temp为事先保存的array[i]的值)。
for (int i = 1; i < array.length; i++) { int temp = array[i], j; for (j = i - 1; j >= 0 && temp < array[j]; j--) { // array[i]与arra[j]一边比较,一边移动(当array[i]<array[j]) array[j + 1] = array[j]; } array[j + 1] = temp; }
三、a[i]插入有序序列a[0]...a[i-1]时,设temp = array[i],如果a[j]<temp也可以是array[j+1]<array[j],则交换a[j]与a[j+1] j∈{0..i-1}
for (int i = 1; i < array.length; i++) { int temp = array[i],j; for (j = i - 1; j >= 0; j--) { if (array[j] > temp) { array[j] = array[j] ^ array[j + 1]; array[j + 1] = array[j] ^ array[j + 1]; array[j] = array[j] ^ array[j + 1]; } } }
参考:
http://blog.csdn.net/morewindows/article/details/17488865
相关推荐
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
在本系列的“算法可视化”中,我们将深入探讨插入排序的实现及其在实际编程中的应用。 **一、插入排序的基本概念** 插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
本文将重点讨论标题和描述中提及的几种排序算法:插入排序、快速排序、归并排序以及希尔排序。 **1. 插入排序** 插入排序是一种简单直观的排序算法,它的工作原理类似于我们平时整理扑克牌的方式。首先,数组被视...
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
直接插入排序是一种基础且简单的排序算法,它的工作原理类似于我们日常生活中的整理扑克牌。在Java中实现这个算法,我们可以从以下几个关键知识点入手: 1. **基本思想**:直接插入排序是通过构建有序序列,对于未...
本篇文章将详细讨论几种常见的排序算法:选择排序、冒泡排序、插入排序、合并排序以及快速排序,分析它们的算法原理、时间效率,并通过经验分析验证理论分析的准确性。 **1. 选择排序(Selection Sort)** 选择排序...
本文主要探讨四种基本的排序算法:插入排序、交换排序、选择排序和归并排序,这些都是内部排序的主要方法。 1. **插入排序**: - 直接插入排序是最基础的排序算法之一,它的工作原理类似于人们手动整理扑克牌。...
例如,对于小规模数据,简单的排序算法如冒泡和插入排序就足够了;而对于大规模数据,快速排序和归并排序通常更优。理解这些算法的原理并能用C++实现,对提升编程能力有很大帮助。在实际应用中,还需要根据具体需求...
本篇将详细阐述标题和描述中提到的几种线性表排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、堆排序以及归并排序。 1. **插入排序**: 插入排序是一种简单直观的排序算法,它的工作原理是通过构造一个...
在这一大类排序算法中,有三种常见的实现方式:直接插入排序、希尔排序和折半插入排序。 ### 1. 直接插入排序 直接插入排序是最基础的插入类排序,其步骤如下: 1. 将序列中的第一个元素视为已排序部分。 2. 从第...
Java排序算法 - 插入排序 插入排序(Insertion Sort)是一种简单的排序算法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。该算法的实现非常简单,但其时间复杂度...
插入排序算法是一种简单的排序算法,它的工作原理是通过将每个元素插入到已经排序的序列中,以达到排序的目的。插入排序算法的时间复杂度为O(n^2),因此它适合小规模的数据排序。 4.快速排序算法 快速排序算法是一...
插入排序是一种基础且直观的排序算法,它的工作原理可以类比于整理扑克牌。在实际应用中,插入排序对于小规模数据或者部分有序的数据表现优秀,但对于大规模无序数据,其效率相对较低。以下是关于插入排序的详细知识...
1) 对以下6种常用的内部排序算法进行比较:起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序。 2) 待排序记录的文件个数不小于1000( 其数据用伪随机数产生),至少用5组不同的输入数据作比较;比较...
排序算法汇总(选择排序、直接插入排序、冒泡排序、希尔排序、快速排序、堆排序) 本资源介绍了六种常用的排序算法:选择排序、直接插入排序、冒泡排序、希尔排序、快速排序和堆排序。下面对每种算法进行详细介绍:...
总的来说,这段代码提供了四种排序算法的实现,分别是冒泡排序、选择排序、插入排序以及Java内置的数组排序。每种排序算法都有其适用场景,理解这些算法可以帮助我们更好地解决实际问题,并根据需求选择合适的排序...
这里我们将深入探讨标题和描述中提到的六种排序算法:快速排序、归并排序、插入排序、冒泡排序、选择排序以及堆排序。 1. **快速排序**:由C.A.R. Hoare在1960年提出,是一种高效的分治算法。快速排序的基本思想是...
本资源提供了三种经典的排序算法的C语言实现:堆排序、直接插入排序和快速排序。 首先,让我们详细了解这些排序算法。 1. **直接插入排序**: 直接插入排序是一种简单的排序算法,它的工作原理类似于我们手动排序...