一、 直接插入排序 (Straight Insertion Sort)
基本思想是:假设待排序的记录存放在数组R[1..n]中。初始 时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止, 依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序 区。
当插入第i (i 1) 个记录时,前面的 R[1], …, R[i-1]已经排好 序。这时,用R[i]的关键字与R[i-1], R[i-2], … R[1] 的关键字顺序 进行比较,找到插入位置即将R[i]插入,插入位置之后的所有记 录依次向后移动。
InfoType otherinfo; //其它数据项
}RcdType;
typedef struct {
RcdType r[MAXSIZE+1]; // r[0] 闲置或用作哨兵单元
int length;
//顺序表长度
}SqList;
//顺序表类型
9
2. 评价排序算法好坏的标准: ① 时间性能分析 以算法中用得最多的基本操作的执行次数(或者其 数量级)来衡量,这些操作主要是比较元素、移动或 交换元素。在一些情况下,可能还要用这些次数的平 均数来表示。
13
直接插人排序算法描述: 方法:Ki与Ki-1,Ki-2,…K1依次比较,直到找到应插入的位置。 void InsertSort (SqList&L){ //对顺序表L作直接插入排序。
for(i=2;i<=L.length;++i) if LT(L.r[i].key,L.r[i-1].key){//“<”,需将L.r[i]插入有序子表 L.r[0]=L.r[i] //复制为哨兵 L. r[i] = L. r[i-1]; //后移 for ( j=i-2 ; LT(L.r[0].key,L.r[j].key); --j) L.r[j+1]=L.r[j]; //记录后移 L.r[j+1]=L.r[0] // 插入到正确位置 }