软件技术基础新(数据结构).ppt

软件技术基础新(数据结构)

第 * /209页 一、插入排序 基本思想是:每步将一个待排序的记录,按关键码值的大小插入到前面已排序的适当位置上,直到全部插完为止。 1. 直接插入排序 在排好的序列中用顺序法查找插入位置,找到后将它后面的所有记录后移一个位置,再插入新记录。 排序n个记录的文件,关键码比较次数为n2量级,记录移动个数也为n2量级。 第 * /209页 基本思想是: 把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。 把a[i]插入到a[0],a[1],...,a[i-1]之中的具体实施过程为:先把a[i]赋值给变量t,然后将t依次与a[i-1],a[i-2],...进行比较,将比temp大的元素右移一个位置,直到发现某个j(0=j=i-1),使得a[j]=t或j为(-1),把t赋值给a[j+1]。 第 * /209页 void InsertSort(ElemType R[], int n) { int i,j; ElemType temp; /* 待排序元素用一个数组R表示,数组有n个元素 */ for (i=1; in; i++) { /* i表示插入次数,共进行n-1次插入 */ t=R[i]; /* 把待排序元素赋给t */ j=i-1; while ((j=0) (tR[j])) { R[j+1]=R[j]; j--; } /* 顺序比较和移动 */ R[j+1]=t; } } 时间复杂度:O(n2) 空间复杂度:O(1) 第 * /209页 哨兵的作用 算法中引进的附加记录R[0]称监视哨或哨兵。 哨兵有两个作用: ① 进人查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容; ② 它的主要作用是:在查找循环中“监视”下标变量j是否越界。一旦越界(即j=0),因为R[0]和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件“j=1”)。 注意: ① 实际上,一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。 ② 引入哨兵后使得测试查找循环条件的时间大约减少了一半,所以对于记录数较大的文件节约的时间就相当可观。对于类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。所以不能把上述算法中的哨兵视为雕虫小技,而应该深刻理解并掌握这种技巧。 第 * /209页 2. 二分法(折半)插入排序 在已排好序的序列中使用二分法查找插入位置,找到后移动其后记录插入新记录。关键字比较次数降为nlog2n量级,记录移动个数仍为n2量级。 第 * /209页 void BinInsertSort (ElemType r[], int n) { ElemType temp; int i, j, low, hight, m; for (i=1; in; i++) {// r[0]已经有序,从r[1]开始 if (r[i].keyr[i-1].key) { // 准备插入 low = 0; high = i-1; while (low=high) { //折半查找法,寻找插入位置 m=(low+high)/2; if (r[m].keyr[i].key) high=m-1; //取左区间 if (r[m].keyr[i].key) low=m+1; if (r[m].key=r[i].key) { high=m; break; } } //while 结束, r[i]应该插在 high+1的位置上 第 * /209页 temp=r[i]; // 保存r[i], 同时留出移动的空间 j=i-1; while (j=high+1) { r[j+1]=r[j]

文档评论(0)

1亿VIP精品文档

相关文档