七章节排序演示教学.ppt

第七章 排 序;排序:将文件中一组记录(或数据)按其关键字的值以递增(或递减)的次序重新进行排列的操作过程。;排序的对象: 文件;关键字:;排序的分类;内排序的分类:;排序的性能比较:;7.2、插入排序;7.2.1 直接插入排序; 初始: [49] 38 65 97 76 13 27 49 i=1: [38 49] 65 97 76 13 27 49 i=2: [38 49 65] 97 76 13 27 49 i=3: [38 49 65 97] 76 13 27 49 i=4: [38 49 65 76 97] 13 27 49 i=5: [13 38 49 65 76 97] 27 49 i=6: [13 27 38 49 65 76 97] 49 i=7: [13 27 38 49 49 65 76 97] 稳定排序 ;7.2.1 直接插入排序;7.2.1 直接插入排序;具体算法如下:;算法性能分析;空间的开销:只需要一个记录的辅助空间 S(n)= O(1); 由于插入排序的基本操作是在有序表中进行查找,而查找的过程是可以用折半查找来实现的。由此实现的排序称为二分法插入排序。;(1) 13 27 38 49 65 76 97 49 left=0 mid=3 right=6 (2) 13 27 38 49 65 76 97 49 left=4 mid=5 right=6 (3) 13 27 38 49 65 76 97 49 left=4 mid=4 right=4 ∵ 49’65 ∴ right=mid-1=3 left=4right ∴ 已找到插入位置left=4 (4) 13 27 38 49 49 65 76 97 ;void binSort(SortObject * pvector) { int i, j, left, mid, right; RecordNode temp;? for( i = 1; i pvector-n; i++ ) { temp = pvector-record[i]; left = 0; right = i – 1; /* 置已排序区间的下、上界初值 */ while (left = right) { mid=(left+right)/2; /* mid指向已排序区间的中间位置 */ if (temp.keypvector-record[mid].key) right=mid-1; /* 插入元素应在左子区间 */ else left=mid+1; /* 插入元素应在右子区间 */ } for(j=i-1; j=left; j--) pvector-record[j+1] = pvector-record[j]; /* 将排序码大于ki的记录后移 */ if(left!=i) pvector-record[left] = temp; } } ;算法分析: 空间效率:同直接插入排序 时间效率:仅减少了比较次数,移动记录次数不变。 n ?? log2i ? ? n?log2n i=1 最坏的情况为n2/2,最好的情况为2n,???均移动次数为O(n2) ;7.2.3 表插入排序;类型声明如下: struct Node; typedef struct Node ListNode; struct Node { KeyType key; DataType info; ListNode *next; }; typedef ListNode * LinkList;;void listSort(LinkList * plist) { ListNode *now, *pre, *p, *q, *head;? head=*plist; if(head-next==NULL ||head-next-

文档评论(0)

1亿VIP精品文档

相关文档