一、插入类排序
基本思想:
在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,
直到将所有待排记录全部插入为止。
(1)直接插入排序
***思想
将第i个记录的关键字Ki,依次与前面的i-1个记录的关键字进行比较,将所有关键字大于ki的记录依次向后移动
一个位置,直到遇到一个关键字小于或等于Ki的记录,此时该记录后面必为空位置,将第i个记录插入到空位置即可。
完整的直接插入排序是从i = 2开始的,也就是说,将第一个记录视为已排好序的单元素子集合,然后将第二个记录
插入到单元素子集合中。
***算法
void InsSort(RecordType r[],int length)
{
for(int i = 2;i<=length;i++) //直接插入排序是从i= 2开始的
{
r[0] = r[i] ; //设置监视哨
j = i-1;
while(r[0].key < r[j].key) //寻找插入位置
{
r[j+1] = r[j] ;
j -= 1;
}
r[j+1] = r[0] ; //将待插入的记录插入到已排序的序列中
}
}
***要点
》》》使用监视哨r[0]临时保存待插入的记录
》》》从后向前查找应插入的位置
》》》查找和移动在同一循环中完成
***案例
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef int OtherType;
typedef struct _RecordType
{
KeyType key;
OtherType other_data;
}RecordType;
void InsSort(RecordType r[],int length)
{
int i,j;
for(i = 2;i<=length;i++)
{
r[0] = r[i];
j = i-1;
while(r[0].key < r[j].key)
{
r[j+1] = r[j];
j -= 1;
}
r[j+1] = r[0];
}
}
int main()
{
RecordType r[20];
int len;
int i;
printf("请输入数组的长度\n:");
scanf("%d",&len);
for(i = 1;i<=len;i++)
{
printf("请输入数组的第%d个元素",i);
scanf("%d",&r[i].key);
}
printf("\n");
printf("排序前的结果:\n");
for(i = 1;i<=len;i++)
{
printf("%d",r[i].key);
}
printf("\n");
InsSort(r,len);
printf("排序后的结果:\n");
for(i = 1;i<=len;i++)
{
printf("%d",r[i].key);
}
printf("\n");
return 0;
}