直接插入排序

转载 2016年08月30日 23:47:40

算法思想

把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。

设无序数组为a[0…n-1]。

  • 1.初始时,a[0]自成1个有序区,无序区为a[1..n-1]。

  • 2.令i=1,将a[i]插入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。

  • 3.i++并重复第二步直到i==n-1,排序完成。


一趟直接插入排序方法

具体做法:

将待插入记录 a[i]的关键字从右向左依次与有序区中记录 aj的关键字进行比较:

  • 1.若 a[j]的关键字大于 a[i]的关键字,则将 a[j]后移一个位置;

  • 2.若 a[j]的关键字小于或等于 a[i]的关键字,则查找过程结束,j+1 即为 a[i]的插入位置。

关键字比a[i]的关键字大的记录均已后移,所以 j+1 的位置已经腾空,只要将 a[i] 直接插入此位置即可完成一趟直接插入排序。

例如待排序数组a[0]=8,a[1]=5,a[2]=10,a[3]=12,a[4]=7,a[5]=6

第一趟:a[0]=8,有序,a[1…5]无序。

第二趟:temp=5,a[1]=5 < a[0]=8, 8往后移一位,a[1]=8,a[0]=5,a[0…1]有序,a[2…5]无序。

第三、四趟:a[2]=10 > a[1]=8,a[3]=12 > a[2]=10,有序无须移动,a[4…5]无序。

第五趟:temp=7,a[4]=7 < a[3]=12,12往后移一位,a[4]=12,依次类推…直到a[0]=5 < temp,即a[1]=7。

第六趟类比第五趟,可以得到6插入位置为a[1]=6。排序完成。


直接插入排序算法时间复杂度:O(n^2);空间复杂度:O(1)。直接插入排序是稳定的排序方法。

直接插入排序算法代码

//直接插入排序
void insertSort(int *arr, int n) {   
    //第一个数肯定是有序的,从第二个数开始遍历
    for (int i = 1; i < n; ++i) {
        int temp = arr[i];
        int j;
        for (j = i - 1; j >= 0 && temp < arr[j]; --j) {
            arr[j + 1] = arr[j];
        }
        arr[j + 1] = temp;
    }
}

Test

用直接插入排序算法对数组arr[10] = {8, 5, 10, 12, 7, 6, 15, 9, 11, 3};从小大排序。

@Test
    public void sort1() {// 直接插入排序
        Integer arr[] = { 8, 5, 10, 12, 7, 6, 15, 9, 11, 3 };
        for (int i = 1; i < arr.length; i++) {// 第一个数肯定是有序的,从第二个数开始遍历
            int temp = arr[i];
            int j;
            for (j = i - 1; j >= 0 && temp < arr[j]; --j) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = temp;
        }
        // 输出数组元素
        for (Integer it : arr) {
            System.out.print(it + "   ");
        }
    }

输出

3   5   6   7   8   9   10   11   12   15   

数据结构与算法——直接插入排序

好久没写博客了,今天就简单总结下直接插入排序。 什么是直接插入排序? 直接插入排序就是将某一个元素与顺序表中元素进行比较,然后插入到相应的位置,使整个顺序表处于有序状态。有关数据结构的书上都会用扑...
  • hsk256
  • hsk256
  • 2015年06月11日 16:59
  • 1387

八大排序算法之一直接插入排序(C语言)

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八大排序就是内部排序。 ...
  • liujiejieliu1234
  • liujiejieliu1234
  • 2015年04月22日 15:06
  • 8023

排序算法一:直接插入排序

在我的博文《“主宰世界”的10种算法短评》中给出的首个算法就是高效的排序算法。本文将对排序算法做一个全面的梳理,从最简单的“冒泡”到高效的堆排序等。...
  • LG1259156776
  • LG1259156776
  • 2015年09月23日 22:08
  • 41829

直接插入排序的C实现

  • 2013年05月16日 11:20
  • 495B
  • 下载

直接插入排序

  • 2014年03月25日 15:22
  • 1.02MB
  • 下载

直接插入排序

  • 2015年10月06日 22:02
  • 1.01MB
  • 下载

直接插入排序法和分治法

  • 2011年04月09日 03:05
  • 2KB
  • 下载

直接插入排序

  • 2018年01月13日 09:47
  • 600B
  • 下载

直接插入排序java源码

  • 2013年06月04日 20:31
  • 703B
  • 下载

简单的直接插入排序

  • 2012年06月12日 08:50
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:直接插入排序
举报原因:
原因补充:

(最多只允许输入30个字)