第3章排序1(第6次课)精品.pptVIP

  • 1
  • 0
  • 约5.01千字
  • 约 50页
  • 2017-06-13 发布于湖北
  • 举报
* 令 i = 2,3,…, n, 实现整个序列的排序。 for ( i=2; i=n; ++i ) if (R[i].keyR[i-1].key) { 在 R[1..i-1]中查找R[i]的插入位置; 插入R[i] ; } * void InsertionSort ( SqList L ) { // 对顺序表 L 作直接插入排序。 for ( i=2; i=L.length; ++i ) if (L.r[i].key L.r[i-1].key) { } } // InsertSort L.r[0] = L.r[i]; // 复制为监视哨 for ( j=i-1; L.r[0].key L.r[j].key; -- j ) L.r[j+1] = L.r[j]; // 记录后移 L.r[j+1] = L.r[0]; // 插入到正确位置 * 内部排序的时间分析: 实现内部排序的基本操作有两个: (2)“移动”记录。 (1)“比较”序列中两个关键字的大小; * 对于直接插入排序: 最好的情况(关键字在记录序列中顺序有序): “比较”的次数: 最坏的情况(关键字在记录序列中逆序有序): “比较”的次数: 0 “移动”的次数: “移动”的次数: * 二、起泡排序 在实现有序性的过程中, 使用了交换的操作 *  假设在排序过程中,记录序列R[1..n]的状态为: 第 i 趟起泡排序 无序序列R[1..n-i+1] 有序序列 R[n-i+2..n] n-i+1 无序序列R[1..n-i] 有序序列 R[n-i+1..n] 比较相邻记录,将关键字最大的记录交换到 n-i+1 的位置上 起泡排序 * void BubbleSort(Elem R[ ], int n) { while (i 1) { } // while } // BubbleSort i = n; i = lastExchangeIndex; // 本趟进行过交换的 // 最后一个记录的位置 if (R[j+1].key R[j].key) { Swap(R[j], R[j+1]); lastExchangeIndex = j; //记下进行交换的记录位置 } //if for (j = 1; j i; j++) lastExchangeIndex = 1; * 注意: 2. 一般情况下,每经过一趟“起泡”,“i 减一”,但并不是每趟都如此。 例如: 2 5 5 3 1 5 7 9 8 9 i=7 i=6 for (j = 1; j i; j++) if (R[j+1].key R[j].key) … 1 3 i=2 1. 起泡排序的结束条件为, 最后一趟没有进行“交换记录”。 * 1. 双向链表 五、其它形式的链表 typedef struct DuLNode { ElemType data; // 数据域 struct DuLNode *prior; // 指向前驱的指针域 struct DuLNode *next; // 指向后继的指针域 } DuLNode, *DuLinkList; * 最后一个结点的指针域的指针又指回第一个结点的链表 a1 a2 … ... an 2. 循环链表 和单链表的差别仅在于,判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。 * 在循环链表中,头指针也可以改变到指向尾结点,这样用一个头指针就能够控制首位两端,可为有些操作带来便利。 a1 a2 … ... an * 双向循环链表 空表 非空表 a1 a2 … ... an * 双向链表的操作特点: “查询” 和单链表相同。 “插入” 和“删除”时需要同时修改两个方向上的指针。 由于前驱指针的设置,如需要前驱的位置信息时,可直接使用,避免了遍历操作的时间消耗。 * ai-1 ai e s-next = p-next; p-n

文档评论(0)

1亿VIP精品文档

相关文档