插入排序(Insertion Sort)的基本思想是每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子文件中的适当 位置直到全部记录插入完成为止 本节介绍两种插入排序方法直接插入排序和希尔排序 直接插入排序基本思想 基本思想 假设待排序的记录存放在数组R[n]中初始时R[]自成个有序区无序区为R[n]从i=起直至i=n为止依次将 R[i]插入当前的有序区R[i]中生成含n个记录的有序区 第i趟直接插入排序 通常将一个记录R[i](i=…n)插入到当前的有序区使得插入后仍保证该区间里的记录是按关键字有序的操作称第i 趟直接插入排序 排序过程的某一中间时刻R被划分成两个子区间R[i](已排好序的有序区)和R[in](当前未排序的部分可称无 序区) 直接插入排序的基本操作是将当前无序区的第个记录R[i]插人到有序区R[i]中适当的位置上使R[i]变为新的有 序区因为这种方法每次使有序区增加个记录通常称增量法 插入排序与打扑克时整理手上的牌非常类似摸来的第张牌无须整理此后每次从桌上的牌(无序区)中摸最上面的张并插入左 手的牌(有序区)中正确的位置上为了找到这个正确的位置须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较 一趟直接插入排序方法 简单方法 首先在当前有序区R[i]中查找R[i]的正确插入位置k(≤k≤i);然后将R[ki]中的记录均后移一个位置腾出k位 置上的空间插入R[i] 注意 若R[i]的关键字大于等于R[i]中所有记录的关键字则R[i]就是插入原位置 改进的方法 一种查找比较操作和记录移动操作交替地进行的方法 具体做法 将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=ii…)的关键字进行比较 ① 若R[j]的关键字大于R[i]的关键字则将R[j]后移一个位置; ②若R[j]的关键字小于或等于R[i]的关键字则查找过程结束j+即为R[i]的插入位置 关键字比R[i]的关键字大的记录均已后移所以j+的位置已经腾空只要将R[i]直接插入此位置即可完成一趟直接插入排序 直接插入排序算法 算法描述 void lnsertSort(SeqList R) { //对顺序表R中的记录R[n]按递增序进行插入排序 int ij; for(i=;i<=n;i++) //依次插入R[]…R[n] if(R[i]key //应在原有位置上 R[0]=R[i];j=i-1; //R[0]是哨兵,且是R[i]的副本 do{ //从右向左在有序区R[1..i-1]中查找R[i]的插入位置 R[j+1]=R[j]; //将关键字大于R[i].key的记录后移 j-- ; }while(R[0].key R[j+1]=R[0]; //R[i]插入到正确的位置上 }//endif }//InsertSort |