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

算法描述:

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

比如给定一行递增的数字: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
#include
#define Maxsize 20
typedef 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;
} 

运行截图:
【数据结构基础】直接插入排序_第1张图片

    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

你可能感兴趣的:(数据结构和算法)