~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

首先,把书上的算法简化一下,直接用数组研究更直观。

定义一个数组:

int a[]={23,5,17,35,12,50,75,21};
int length=sizeof(a)/sizeof(int); /* 计算长度 */

它假设第一个元素是有序的,然后用第二个元素(下一个元素)和它进行比较,通过循环移动判定,得到一个有序列。
得到一个有序列之后,再用下一个元素和这个有序列进行比较,这里的比较,就是局部比较,采用的是尾插法,从后往前。

比如,前两个元素排成有序列后,得到:5 23,接着,用17和这个有序列比较,方式是从右到左。
此处有个注意的地方,假如比较的数据一直小于有序列,可能会造成数组越界,所以在判定的时候要约束一下范围。
下一个问题,一共比较的次数,这里应该是总长度-1,假如10个数据,需要比较9次。

#include <iostream>
using namespace std;
int main(void)
{
    int a[]={6,9,2,3,15,7,18,10,21};
    int length=sizeof(a)/sizeof(int);/*计算数组长度*/
    int j,e;
    for(int i=0;i<length-1;i++)
    {
        j=i; /*j等于有序列最右边的元素(末端)*/
        e=a[j+1];/*e总是等于下一个待排序的数*/
        while(j>-1 && e>a[j]) /*判定移动*/
      {
          a[j+1]=a[j];
          j--;
      }
      a[j+1]=e;/*在合适的位置插入数据,而且必定是在j+1的位置*/
    } 
    for(i=0;i<length;i++)
    cout<<a[i]<<" ";
    return 0;
}

记忆思路(四步):

初始化j: j=i
赋值e : e=a[j+1]
循环移动 while()
插入e a[j+1]=e;

另外,书上采用关键字key,模型与之完全相同。但是,关键的还是模型,代码太多,有时根本无法记住,所以简化也是一种记忆的方式!

书上代码参考:

void InsertSort(SqList *L)
/*直接插入排序*/
{
    int i,j;
    DataType t;
    for(i=0;i<L->length-1;i++)        /*前i个元素已经有序,从第i+1个元素开始与前i个的有序的关键字比较*/
    {
        t=L->data[i+1];                /*取出当前待排序的元素*/
        j=i;
        while(j>-1&&t.key<L->data[j].key)/*寻找当前元素的合适位置*/
        {
            L->data[j+1]=L->data[j];
            j--;
        }
        L->data[j+1]=t;                /*将当前元素插入合适的位置*/
    }
}
posted on 2016-03-06 18:42  LuoTian  阅读(312)  评论(0编辑  收藏  举报