Chinaunix首页 | 论坛 | 博客
  • 博客访问: 521115
  • 博文数量: 257
  • 博客积分: 1666
  • 博客等级: 上尉
  • 技术积分: 1535
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-02 23:02
文章分类

全部博文(257)

文章存档

2013年(2)

2012年(255)

分类:

2012-09-08 14:19:25

原文地址:插入排序(InsertionSort) 作者:

1.基本思想
    假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从 i=2 起直至 i=n 为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

2.i-1趟直接插入排序
    通常将一个记录R[i](i=2,3,…,n-1)插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作称第i-1趟直接插入排序。

    排序过程的某一中间时刻,R被划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。
    直接插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。
    插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。

3.说明
    插入排序的时间复杂度是O(N^2),是原地排序,且是稳定的排序。

4.实现

点击(此处)折叠或打开

  1. void insertSort(int *pData, int num)
  2. {
  3.     int i, j, key;

  4.     for (j = 1; j < num; j++) // 循环次数
  5.     {
  6.         key = pData[j]; //把第j个元素插入到前j-1个有序的序列中
  7.         i = j - 1; //循环的初始

  8.         while (i >= 0 && pData[i] > key)
  9.         {
  10.             pData[i+1] = pData[i]; //从后往前遍历,若比key值大,则元素后移(为后面>的插入做准备)
  11.             i--;
  12.         } //找到第一个比key值小的位置

  13.         pData[i+1] = key; //key插入到第i一个比key小的元素的位置之后
  14.     }
  15. }
阅读(351) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~