数据结构与算法(10)..ppt
《数据结构与算法(10)..ppt》由会员分享,可在线阅读,更多相关《数据结构与算法(10)..ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章.内部排序 (Chapter 10.Internal Sorting)排序又称分类,是计算机中最重要的操作,它是将一个数据元素(或记录)的任意序列排列成一个按关键字有序的序列。若待排序列中存在两个或以上关键字相等的记录,设Ki=Kj(1i jn),即排序前 Ri 在 Rj 前,若在排序后 Ri 仍在 Rj 前,则称排序是稳定的。稳定的排序方法(稳定的排序方法(stable sorting method)排序(排序(sorting)不稳定的排序方法(不稳定的排序方法(unstable sorting method)待排序列中存在两个或以上关键字相等的记录,设Ki=Kj(1i jn),即排序
2、前 Ri 在 Rj 前,若在排序后 Rj 却在 Ri前,则称排序是不稳定稳定的。内部排序(内部排序(internal sorting)待排序列记录全部存放在计算机随机存储器中进行排序的过程称为内部排序。外部排序(外部排序(external sorting)待排序列记录数量太大,不能全部存放在计算机随机存储器中,排序过程中需对计算机外存进行访问,这种排序过程称为外部排序。1、比较操作:比较两个关键字值的大小的操作。排序过程中的两种基本操作:排序过程中的两种基本操作:2、移动操作:将记录从一个位置移动到另一个位置的操作。待排序列的三种存储结构:待排序列的三种存储结构:1、顺序存储:存储在地址连续的
3、一组存储单元中(以此为例)。2、链式存储:存储在地址不连续的一组存储单元(链表)中。3、地址存储:记录顺序存储,另设关键字和记录地址排序。typedef struct keytype key;.elemtype;typedef struct elemtype *elem;int length;sqlist;10.1 插入排序一、直接插入排序:一、直接插入排序:直接插入排序(straight insertion sort)是一种最简单的排序方法:将记录一个个插入到已排序好的有序表中,从而得到长度增加的新的有序表。void straightinsertsort (sqlist&R)for (i=2
4、;i=R.length;i+)if (R.elemi.key R.elemi-1.key)R.elem 0 =R.elem i ;R.elem i =R.elem i-1 ;for (j=i-2;R.elem0.key R.elemj.key;j-)R.elem j+1=R.elem j;R.elem j+1 =R.elem 0 ;排序性能分析:比较次数:最好情况 n-1 最坏情况 (n+2)(n-1)/2 平均比较次数:(n+4)(n-1)/4二、折半插入排序:二、折半插入排序:折半插入排序(binary insertion sort)与直接插入排序不同之处在于查找插入位置时不是用顺序查找,
5、而是用折半查找。可见,直接插入排序的时间复杂度为 O(n 2)。但在待排序列有序的的情况下,直接插入排序的时间复杂度下降为 O(n)。移动次数:最好情况 0 最坏情况 (n+4)(n-1)/2 平均移动次数:(n+4)(n-1)/4 折半插入排序的移动次数与直接插入排序相同,只是比较次数少了,因此其时间复杂度也为 O(n 2)。三、三、2-路插入排序:路插入排序:2-路插入排序目的是为了减少排序过程中移动记录的次数,代价是需要 n 个记录的辅助空间 d:将 r1 赋值给 d1,将 d 看成循环的,其它记录均与 d1 比较,比其小则在 d1 前插入,反之则在 d1 后插入。2-路插入排序的移动次
6、数大约为 n 2/2,因此其时间复杂度仍为 O(n 2)。四、表插入排序:四、表插入排序:表插入排序需附设一个指针域,通过改变指针的值来达到不移动记录而得到排序结果的目的。表插入排序是用改变指针来代替移动记录操作,因此其时间复杂度还为 O(n 2)。表插入排序的结果是形成了链表,因此查找时只能用顺序查找,为能使用折半查找,需对记录重新排序,但这不影响其时间复杂度。五、希尔排序:五、希尔排序:希尔排序(Shells method),又称为“缩小增量排序”(diminishing increment sort),是一种比较复杂的插入排序。希尔排序的思想是:用一定的增量间隔将待排序列分成多个组,每组
7、都采用简单插入排序;排序完一遍后,缩小增量间隔,再对新的分组采用简单插入排序;反复此过程,直至增量间隔为 1,即整个待排序列为一组时,执行一遍简单插入排序后结束。125256 345 12 214 8 452 21 99 618 7732待排序列:125 32 256 345 12 214 8 452 21 99 618 77增量为 7:125452322125699345618127712532 256345 12 214 8 45221 99618 77增量为 5:1253225634512 21484522199618 77增量为 3:12521461821877994523453212
8、25612532256345122148452219961877增量为 1:12532256 345122148452219961877排序结果:321253221256812452618992143457712532256345122148452219961877322125699218773453221321252567799214345void Shellinsert(sqlist&L,int dk)for (i=dk+1;i=L.length;i+)if (L.elemi.key 0&L.elem0.key L.elemj.key;j-=dk)L.elemj+dk=L.elemj;L.
9、elemj+dk=L.elem0;希尔排序的时间复杂度与增量序列有关,分析起来很复杂,有人认为为 O(n 1.5),也有人认为为 O(n 1.3)。在以上插入排序中,除希尔排序为不稳定排序外,其余的都是稳定的排序。void Shellsort(sqlist&L,int dlta,int t)for (k=0;k t;k+)Shellinsert(L,dltak);10.2 交换排序一、起泡排序:一、起泡排序:起泡排序(bubble sort)也是一种最简单的排序方法:将相邻两记录一一比较,将关键字较小的记录交换在前面,反复此过程,直到待排序列有序为止。void bubblesort(sqlis
10、t&r)for (i=1;i=r.length;i+)for(j=1;j r.elem j+1.key)r.elem j r.elem j+1;起泡排序也是一种稳定的排序,时间复杂度为 O(n 2)。二、快速排序:二、快速排序:快速排序(quick sort)是对起泡排序的改进:将待排序列第一个元素枢轴元素(pivot)放置到序列中的某个位置,使其前面的所有元素的关键字都小于它,后面的所有元素的关键字都大于它;再分别对枢轴元素前面和后面的两段待排序列采用快速排序方法,直至每一段都只剩下一个元素为止。int quickpass(sqlist&R,int low,int high)R.elem0=
11、R.elemlow;pivotkey=R.elemlow.key;while (low high)while (low=pivotkey)high-;R.elemlow=R.elemhigh;while (low high&R.elemlow.key=pivotkey)low+;R.elemhigh=R.elemlow;R.elemlow=R.elem0;return low;void quicksort(sqlist&r,int low,int high)if (low high)pivotloc=quickpass(r,low,high);quicksort(r,low,pivotloc-
12、1);quicksort(r,pivotloc+1,high);快速排序是基于比较和交换的排序方法里最快的一种排序,其时间复杂度为 O(n log n)。但快速排序的效率不太稳定,在关键字均匀分布时,效率最高;在关键字有序时,效率将退化为 O(n 2)。如何解决这个难题呢?如何解决这个难题呢?其实,我们仔细分析就可看出,效率低是因为枢轴元素的选取有问题:我们希望每次选取的枢轴元素都处于待排序列中间位置,但当待排序列有序时,枢轴元素的取值每次都是最大的或最小的。有鉴于此,我们能否考虑在枢轴元素选取时,与部分元素比较一下,选取它们中处于中间大小的元素与枢轴元素交换,作为新的枢轴元素,通常是将处于待
13、排序列头部、尾部和中间的三个元素比较,从而得到新的枢轴元素,这种方法叫“三者取中法”,它能很有效的防止快速排序效率的退化。在空间复杂度上,除静态数据外,由于递归的原因,栈的最大深度在最好的情况下为 O(log n),在最坏的情况下为 n。在非递归算法中,每次都先对较短的子序列先进行排序能降低栈的深度。快速排序是不稳定排序。void quicksort(sqlist&r,int low,int high)INITSTACK(S);while (low n2&n1 1)PUSH(S,(low,pivotloc-1);low=pivotloc+1;else if (n1 1)PUSH(S,(pivo
14、tloc+1,high);high=pivotloc-1;if (low=high&!EMPTY(S)(low,high)=POP(S);快速排序的非递归算法如下:作作 业业29.试证明:当待排序列已呈现出有试证明:当待排序列已呈现出有序状态时,快速排序的时间复杂度为序状态时,快速排序的时间复杂度为 O(n 2)。30.试以单链表为存储结构实现简单试以单链表为存储结构实现简单插入排序。插入排序。第第 六六 次次 上上 机机 作作 业业 输入若干组长度各异的待排序列,输入若干组长度各异的待排序列,分别用快速排序算法和改进的枢轴元分别用快速排序算法和改进的枢轴元素三者取中算法对待排序列进行排序,素
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 10
限制150内