【数据结构基础】直接插入排序

来源:互联网 发布:java notify notifyall 编辑:程序博客网 时间:2024/06/06 15:40

算法描述:

直接插入排序的核心思想是:先比较,找到插入的合适位置后,最后插入。程序结束。

比如给定一行递增的数字:1、5、9、14;然后要在这一行里插入一个数字3,假设我们从后面往前比较,3先和14比较,比14小,14往后摞一位,原来14占的位置空出来了;3再与9比较,比9小,9在往后摞一位,原来14占的位置现在被9占,原来9的位置空出来了;依次类推……3与1比较,3比1大,所以3直接插入到原来5的位置。插入结束。

当出现一堆无序的序列时,我们可以将第一个记录看成是一个有序的序列,从第二个记录开始,都看成是即将要插入的记录。

为了算法代码的普适性,我们给出待排记录的普适的数据类型。

typedef struct{ //每一个记录的数据类型     KeyType key;  //关键字项     InfoType otherinfo; //记录中其他的数字项 }RedType; typedef struct{   //记录组成的序列,我们存在顺序表中     RedType r[Maxsize+1]; //r[0]闲置或做哨兵单元    int length; }SqList,*PSqList;

为了方便测试,给出无序序列初始化函数

void InitList(PSqList *L){    *L=(PSqList)malloc(sizeof(SqList));    (*L)->length=0;     int recordCount; //无序序列中的记录的个数    scanf("%d",&recordCount);    for(int i=1;i<=recordCount;i++){        scanf("%d",&(*L)->r[i].key);        (*L)->length++;    }} 

直接插入核心算法:(C语言描述)

void InsertSort(PSqList * L){    for(int i=2;i<=(*L)->length;i++){        (*L)->r[0]=(*L)->r[i];         while(i>1){            if((*L)->r[i-1].key>(*L)->r[0].key){                (*L)->r[i]=(*L)->r[i-1];                i--;            }else{                break;            }        }        (*L)->r[i]=(*L)->r[0];    }}

源代码:

//插入排序算法 #include<stdio.h>#include<stdlib.h>#define Maxsize 20typedef int KeyType; typedef struct{ //每一个记录的数据类型     KeyType key;  //关键字项 //  InfoType otherinfo; //记录中其他的数字项 ,这里为了简单,我们也可以忽略不计 }RedType; typedef struct{   //记录组成的序列,我们存在顺序表中     RedType r[Maxsize+1]; //r[0]闲置或做哨兵单元    int length; }SqList,*PSqList;void InitList(PSqList *L){    *L=(PSqList)malloc(sizeof(SqList));    (*L)->length=0;     int recordCount;    scanf("%d",&recordCount);    for(int i=1;i<=recordCount;i++){        scanf("%d",&(*L)->r[i].key);        (*L)->length++;    }} void InsertSort(PSqList * L){    for(int i=2;i<=(*L)->length;i++){        (*L)->r[0]=(*L)->r[i];         while(i>1){            if((*L)->r[i-1].key>(*L)->r[0].key){                (*L)->r[i]=(*L)->r[i-1];                i--;            }else{                break;            }        }        (*L)->r[i]=(*L)->r[0];    }}void PrintList(PSqList L){    for(int i=1;i<=L->length;i++){        printf("%d ",L->r[i].key);    }}int main(void){    PSqList L;    InitList(&L);     InsertSort(&L);//直接插入排序     PrintList(L);    return 0;} 

运行截图:
这里写图片描述

    for(int i=2;i<=(*L)->length;i++){                    c1 n        (*L)->r[0]=(*L)->r[i];                           c2 n-1        while(i>1){                                      c3 m1             if((*L)->r[i-1].key>(*L)->r[0].key){         c4 m1                (*L)->r[i]=(*L)->r[i-1];                 c5 m2                i--;                                     c6 m2            }else{                                       c7 m3                break;                                   c8 m3            }        }        (*L)->r[i]=(*L)->r[0];                           c9 n-1    }

$m1=
Tn