数据结构 C语言版 李云清 第10章_内排序新.pptVIP

  • 21
  • 0
  • 约9.86千字
  • 约 51页
  • 2015-12-24 发布于广东
  • 举报

数据结构 C语言版 李云清 第10章_内排序新.ppt

通过筛选算法,可以将一个任意的排序码序列建成一个堆,堆的第1个元素,即完全二叉树的根结点的值就是排序码中最小的。将选出的最小排序码从堆中删除,对剩余的部分重新建堆,可以继续选出其中的最小者,直到剩余1个元素排序即告结束。 /* 堆排序算法 */ void heapsort(table *tab) { int i; for(i=tab-length/2;i=1;i--) sift(tab,i,tab-length); /*对所有元素建堆*/ for(i=tab-length;i=2;i--) /* i表示当前堆的大小,即等待排序的元素的个数*/ { tab-r[0].key=tab-r[i].key; tab-r[i].key=tab-r[1].key; tab-r[1].key=tab-r[0].key; /*上述3条语句为将堆中最小元素和最后一个元素交换*/ sift(tab,1,i-1); } } 算法10.7 堆排序算法 10.4交换排序 交换排序的基本思路: 对待排序记录两两进行排序码比较,若不满足排序顺序则交换这对记录,直到任何两个记录的排序码都满足排序要求为止。 10.4.1 冒泡排序 冒泡排序 第1趟,对所有记录从左到右每相邻两个记录的排序码进行比较,如果这两个记录的排序码不符合排序要求,则进行交换,这样一趟做完,将排序码最大者放在最后一个位置; 第2趟对剩下的n-l个待排序记录重复上述过程,又将一个排序码放于最终位置,反复进行n-l次,可将n-l个排序码对应的记录放至最终位置,剩下的即为排序码最小的记录,它在第1的位置处。 如果在某一趟中,没有发生交换,则说明此时所有记录已经按排序要求排列完毕,排序结束。 void bubblesort(table *tab) { int i,j,done; i=1;done=1; while(i=tab-lengthdone) /*最多进行tab-length次冒泡,如没有发生交换则结束*/ { done=0; for(j=1;j=tab-length-i;j++) if(tab-r[j+1].keytab-r[j].key) { tab-r[0].key=tab-r[j].key; tab-r[j].key=tab-r[j+1].key; tab-r[j+1].key=tab-r[0].key; done=1; } i++; } } /*算法10.8 冒泡排序算法*/ 待排序的9个记录的排序码序列为{312,126,272,226,8,165,123,12,28},使用冒泡排序算法进行的排序过程如下图所示: * * 李云清 杨庆红 揭安全 第10章 内排序 排序是数据处理过程中经常使用的一种重要的运算,排序的方法有很多种,本章主要讨论内排序的各种算法,并对每个排序算法的时间和空间复杂性以及算法的稳定性等进行了讨论。 10.1 排序的基本概念 假设一个文件是由n个记录R1,R2,…,Rn组成,所谓排序就是以记录中某个(或几个)字段值不减(或不增)的次序将这n个记录重新排列,称该字段为排序码。能唯一标识一个记录的字段称为关键码,关键码可以作为排序码,但排序码不一定要是关键码。 按排序过程中使用到的存储介质来分,可以将排序分成两大类:内排序和外排序。 内排序是指在排序过程中所有数据均放在内存中处理,不需要使用外存的排序方法。而对于数据量很大的文件,在内存不足的情况下,则还需要使用外存,这种排序方法称为外排序。 排序码相同的记录,若经过排序后,这些记录仍保持原来的相对次序不变,称这个排序算法是稳定的。否则,称为不稳定的排序算法。 评价排序算法优劣的标准 : 首先考虑算法执行所需的时间,这主要是用执行过程中的比较次数和移动次数来度量; 其次考虑算法执行所需要的附加空间。 当然,保证算法的正确性是不言而喻的,可读性等也是要考虑的因素。 排序算法如未作特别的说明,使用的有关定义如下 : /*常见排序算法的头文件,文件名table.h*/ #define MAXSIZE 100 /*文件中记

文档评论(0)

1亿VIP精品文档

相关文档