数据结构排序中的稳定性和不稳定性

合集下载

中国农业大学_821数据结构_《数据结构》习题(9)

中国农业大学_821数据结构_《数据结构》习题(9)

第9章内部排序一、问答题1. 什么是内部排序?什么是排序方法的稳定性?2. 对于本章介绍的内部排序方法,哪几种是稳定的?哪几种是不稳定的?对不稳定的排序方法试举例说明。

3. 对于给定的一组记录的关键字:23,13,17,21,30,60,58,28,30,90。

试分别写出用下列排序方法对其进行排序时,每一趟排序后的结果:(1)直接插入排序;(2)希尔排序;(3)冒泡排序;(4)直接选择排序;(5)快速排序(6)堆排序(7)归并排序。

4. 对长度为n的记录序列进行快速排序时,所需要的比较次数依赖于这n个元素的初始序列。

(1)n = 8时,在最好的情况下需要进行多少次比较?试说明理由。

(2)给出n = 8时的一个最好情况的初始排列实例。

5 试为下列各种情况选择合适的排序方法:(1)n = 30,要求在最坏的情况下,排序速度最快;(2)n = 30,要求排序速度既要快,又要排序稳定。

6. 判别以下序列是否为堆(所有的非叶子结点的关键字值k i均不大于其左右两个分支结点的关键字值k2和k2i+1。

),如果不是,则把它调整为堆。

(1)( 100, 86, 48, 73, 35, 39, 42, 57, 66, 21 );(2)( 12, 70, 33, 65, 24, 56, 48, 92, 86, 33 );(3)( 103, 97, 56, 38, 66, 23, 42, 12, 30, 52, 06, 20 );(4) ( 05, 56, 20, 03, 23, 40, 38, 29, 61, 05, 76, 28, 100 )。

7. 一组待排序记录的关键字是:986,321,123,432,500,654,018,765,987,210。

按照LSD方法写出基数排序的过程和结果。

8. 试证明:如果对于一个长度为n的任意文件进行排序,则至少需进行nlog2n次比较。

9. 试构造对5个整数元素进行排序,最多只用7次比较的算法思想。

计算机专业数据结构第九章测试

计算机专业数据结构第九章测试

数据结构测试(长春理工大学精品课)第9章排序一、选择题1.某内排序方法的稳定性是指( )。

查看答案A.该排序算法不允许有相同的关键字记录B.该排序算法允许有相同的关键字记录C.平均时间为0(n log n)的排序方法D.以上都不对正确答案是D解释:稳定的排序方法指的是若有相同关键字的记录,待排序时在前面的记录排序后仍然排在前面的排序方法。

收起2.下面给出的四种排序法中( )排序法是不稳定性排序法。

查看答案A. 插入B. 冒泡C. 二路归并D. 堆正确答案是D解释:堆排序是不稳定的,交换时有可能把后面的排在前面。

收起3.下面给出的四种排序方法中,排序过程中的比较次数与排序方法无关的是。

( )查看答案A.选择排序法 B. 插入排序法 C. 快速排序法 D. 堆排序法正确答案是A解释:简单选择排序是在待排记录中找到最小的和第一个相交换,再在除了第一个排完的以外找个最小的和第二个相交换,依此类推,n个记录的待排序列需要比较(n-1)+(n-2)+......+0=(n-1)*n/2收起4. 对序列{15,9,7,8,20,-1,4,} 用希尔排序方法排序,经一趟后序列变为{15,-l,4,8,20,9,7}则该次采用的增量是查看答案( )A. lB. 4C. 3D. 2正确答案是B 收起5.下列四个序列中,哪一个是堆()。

查看答案A. 75,65,30,15,25,45,20,10B. 75,65,45,10,30,25,20,15C. 75,45,65,30,15,25,20,10D. 75,45,65,10,25,30,20,15正确答案是C解释:这是一个大根堆,每个结点都比左右孩子小。

收起6.对一组数据(84,47,25,15,21)排序,数据的排列次序在排序的过程中的变化为(1)84 47 25 15 21 (2)15 47 25 84 21 (3)15 21 25 84 47(4)15 21 25 47 84则采用的排序是( )。

6排序

6排序

内排序
25/78
直接选择排序
思想:
从 第 1 趟选择: 1—n 个记录中选择关键字最小的记录,并 和第 1 个记录交换。 从 第 2 趟选择: 2—n 个记录中选择关键字最小的记录,并 和第 2 个记录交换。 ...
从 第n-1趟选择: n-1—n 个记录中选择关键字最小的记录, 并和第 n-1 个记录交换。
内排序
8/78
直接插入排序算法描述
初始,令第 1 个元素作为初始有序表;
依次插入第 2 , 3 , …, k 个元素构造新的有序表; 直至最后一个元素; 例,序列 49 38 65 97 76 13 27
初始,S = { 49 } ; {{13 49 } 49 } 65 } 76 } 97 } 97 } { 38 27 65 49 65 76 13 38 65 97 38 49 38 76 97
移动次数=3+4+„+n+1=(n2+3n-4)/2
平均情况: 比较次数=(n2+n-2)/4 移动次数=(n2+7n-8)/4 直接插入算法的元素移动是顺序的,该方法是稳定的。 12/78 内排序
二分法插入排序
由于直接插入排序算法利用了有序表的插入操作, 故顺序查找操作可以替换为二分法查找操作。 例,序列 49 38 65 97 76 13 27 }
希尔(shell)排序
分析直接插入排序
1. 若待排序记录序列按关键字基本有序,则
排序效率可大大提高;
2. 待排序记录总数越少,排序效率越高;
内排序
33/78
希尔(shell)排序
思想: 先将待排序记录序列分割成为若干子序列分别 进行直接插入排序;

7排序

7排序

数据结构
例: 初始
49 38 65 97 76 13 27
48
55
4
取d1=5 一趟分组:49 38 65 97 76 13 27
48
55
4
一趟排序:13 27 48 55 4
49 38
65
97
76
取d2=3 13 27 48 55 4 二趟分组:
49 38
65
97
76
二趟排序:13
4
48 38 27
做出相应的调整,那样排序的总体效率会非常高。
• 堆排序(Heap Sort)就是对简单选择排序的一种改进。堆排序 算法是Floyd和Williams在1964年共同发明,同时发明了“堆” 这样的数据结构。
数据结构
堆的定义
一、定义
16 11 9
10 1 2
2
5 4
6
大顶堆
8
1
6 9
小顶堆
数据结构
11 4 12 16 5
• R[0]为监视哨(Sentinel),省略下标越界检查“j>0”:一 旦越界,j=0<1,循环条件R[0]<R[j]不成立,自动控制 while循环的结束。
例:有监视哨,第3趟
0 1 2 3 4 5 6 7 8 9 10 m
初始:
i=3: j=2: j=1: j=0:
49 38 13 76 27 49 38 49 13 76 27 49 13 38 49 13 76 27 49 13 38 49 49 76 27 49 13 38 38 49 76 27 49 13 13 38 49 76 27 49
8
堆的定义
一、定义 • 堆是具有下列性质的完全二叉树:任一结点关键字大于等于 其孩子结点的关键字,称为大顶堆;任一结点关键字小于等 于其孩子结点的关键字,称为小顶堆。 • 将R[1]到R[n]看成完全二叉树的顺序存储结构。根据二叉树 的性质5,如果双亲下标为i,其左右孩子的下标分别为2i和 2i+1. 当且仅当任一R[i]满足以下关系时,称之为堆: R[i] ≤ R[2i]且R[i] ≤ R[2i+1] (1 ≤ i ≤ n/2) 或者 R[i] ≥ R[2i]且R[i] ≥ R[2i+1] (1 ≤ i ≤ n/2) 且分别称之为小顶堆和大顶堆。

排序方法的稳定性是指

排序方法的稳定性是指

排序方法的稳定性是指排序方法的稳定性指的是对于具有相同关键字的元素,排序后它们的相对顺序是否保持不变。

换句话说,如果有两个具有相同关键字的元素A和B,且在原始序列中A出现在B的前面,那么在排序后的序列中A仍然应该在B的前面。

稳定性在某些情况下是非常重要的,特别是在处理含有多个关键字的记录时。

例如,考虑一个包含学生信息的数据库,每个学生有姓名和年龄两个关键字。

如果我们按照年龄对学生进行排序,但年龄相同的学生按照姓名进行排序,那么如果年龄相同的学生在排序后的序列中顺序改变,那么原本按照姓名顺序分组的学生可能会被打乱,导致排序的结果变得混乱。

在排序算法中,不同的排序算法具有不同的稳定性。

下面我将演示几种常见的排序算法及其稳定性:1. 冒泡排序:冒泡排序是一个简单但效率较低的排序算法,它通过依次比较相邻的元素并交换位置来排序。

冒泡排序是稳定的,因为只有当相邻元素不符合排序条件才会发生交换。

2. 插入排序:插入排序是一种通过构建有序序列,对于未排序数据,从已排序序列中扫描并找到相应位置插入的排序算法。

插入排序是稳定的,因为只有当新元素小于前面的元素时才会移动,保持了相同关键字元素的相对顺序。

3. 归并排序:归并排序是一种采用分治策略的排序算法,将待排序的序列划分为较小的子序列,然后将子序列进行排序并合并。

归并排序是稳定的,因为在合并过程中,当两个子序列的元素相等时,先合并前一个子序列的元素,保持了相同关键字元素的相对顺序。

4. 快速排序:快速排序也是一种采用分治策略的排序算法,通过选择一个基准元素将序列划分为左右两部分,并递归地对两部分进行排序。

快速排序是不稳定的,因为在划分过程中,相同关键字的元素可能会被分到不同的子序列中。

5. 堆排序:堆排序是一种基于二叉堆数据结构的排序算法,通过构建二叉堆并依次取出堆顶元素,得到排序结果。

堆排序是不稳定的,因为堆的构建过程可能导致相同关键字的元素交换位置。

综上所述,不同的排序算法具有不同的稳定性。

数据结构第9章 排序

数据结构第9章 排序

数据结构第9章排序数据结构第9章排序第9章排名本章主要内容:1、插入类排序算法2、交换类排序算法3、选择类排序算法4、归并类排序算法5、基数类排序算法本章重点难点1、希尔排序2、快速排序3、堆排序4.合并排序9.1基本概念1.关键字可以标识数据元素的数据项。

如果一个数据项可以唯一地标识一个数据元素,那么它被称为主关键字;否则,它被称为次要关键字。

2.排序是把一组无序地数据元素按照关键字值递增(或递减)地重新排列。

如果排序依据的是主关键字,排序的结果将是唯一的。

3.排序算法的稳定性如果要排序的记录序列中多个数据元素的关键字值相同,且排序后这些数据元素的相对顺序保持不变,则称排序算法稳定,否则称为不稳定。

4.内部排序与外部排序根据在排序过程中待排序的所有数据元素是否全部被放置在内存中,可将排序方法分为内部排序和外部排序两大类。

内部排序是指在排序的整个过程中,待排序的所有数据元素全部被放置在内存中;外部排序是指由于待排序的数据元素个数太多,不能同时放置在内存,而需要将一部分数据元素放在内存中,另一部分放在外围设备上。

整个排序过程需要在内存和外存之间进行多次数据交换才能得到排序结果。

本章仅讨论常用的内部排序方法。

5.排序的基本方法内部排序主要有5种方法:插入、交换、选择、归并和基数。

6.排序算法的效率评估排序算法的效率主要有两点:第一,在一定数据量的情况下,算法执行所消耗的平均时间。

对于排序操作,时间主要用于关键字之间的比较和数据元素的移动。

因此,我们可以认为一个有效的排序算法应该是尽可能少的比较和数据元素移动;第二个是执行算法所需的辅助存储空间。

辅助存储空间是指在一定数据量的情况下,除了要排序的数据元素所占用的存储空间外,执行算法所需的存储空间。

理想的空间效率是,算法执行期间所需的辅助空间与要排序的数据量无关。

7.待排序记录序列的存储结构待排序记录序列可以用顺序存储结构和和链式存储结构表示。

在本章的讨论中(除基数排序外),我们将待排序的记录序列用顺序存储结构表示,即用一维数组实现。

数据结构(8).ppt

数据结构(8).ppt
这样通过一趟处理,把待排序记录分成以支点记录 为界的独立的两部分,前面部分记录关键字小于支点记 录关键字,后面部分记录关键字大于支点记录关键字。 然后再按上面方式对每一部分进行同样的分割排序,以 达到整个序列有序(直到每一部分的记录数为1为止)。 快速排序是采用二分法的思想进行排序的方法。 快速排序也是一种交换排序。
冒泡排序算法描述
viod Bubblesort(Sqlist *L) { ElemType temp; int i,j,flag for (i= L->length-1;i>0; --i) { flag=0; for (j=0;j<i;++j) if (L->data[j].key>L.data[j+1].key) { temp=L->data[j];L->data[j]=L->data[j+1]; L->data[j+1]=temp; //交换数据元素 flag=1; //置标识 } if (!flag) break; } }
冒泡排序(续1)
结束标志:若某遍处理无数据交换,说明已排序 好,可提前结束。 若为正序,则只需进行一趟排序,只进行n-1次关 键字比较,无记录移动。 若为逆序,则需进行n-1趟排序,需进行n(n-1)/2次 比较,并做等数量级的记录移动,算法时间复杂度为 O(n2)。 算法中可设置一标志变量flag,每一遍处理开始时, 令其为0,该遍若有数据交换,则置成1。
直接插入排序--算法分析
空间分析:需要一个记录的辅助空间。 时间分析: 1、若记录关键字已按非递减排列,每趟排序插入,只需 进行一次关键字比较,则总的比较次数为n-1。算法时间复杂 度为O(n)。 2、若关键字已按非递增排列,则对第i个记录进行查找插 入时,要比较i次,移动i+1个记录。则总的比较次数为: ∑i=(n+2)(n-1)/2=(n2+n-2)/2 (i=2..n) 移动记录数为∑(i+1)=(n+4)(n-1)/2=(n2+3n-4)/2 平均比较次数=((n2+n-2)/2+n-1)/2=n2/4+3n/4-1≈n2/4 平均移动次数=((n2+3n-4)/2)/2 =n2/2+7n/2-1≈n2/2 则直接插入排序的时间复杂度为O(n2) 直接插入排序为稳定排序。

数据结构总结知识点

数据结构总结知识点

第一章数据结构概念——数据结构,数据元素,数据项,数据类型,抽象数据类型,算法,等。

数据结构定义——指互相有关联的数据元素的集合,用D_S=( D, S ) 或S=( D, R) 表示。

数据结构内容——数据的逻辑结构、存储结构和运算算法效率指标——时间效率(时间复杂度)和空间效率(空间复杂度)总结:数据的逻辑结构和存储结构数据的逻辑结构是数据的机外表示,数据的存储结构是数据的机内表示。

(2) 一种数据的逻辑结构可以用多种存储结构来存储。

(3) 数据结构的基本操作是定义(存在)于逻辑结构,计算机程序设计过程中实现于存储结构。

(4) 采用不同的存储结构,其数据处理的效率往往是不同的。

数据结构?有限个同构数据元素的集合,存在着一定的结构关系,可进行一定的运算。

算法--是对特定问题求解步骤的一种描述,是指令的有限序列。

算法有5个基本特性:有穷性、确定性、可行性、输入和输出第二章1. 数据的逻辑结构是指数据元素之间的逻辑关系,是用户按使用需要建立的。

对2. 线性表的逻辑结构定义是唯一的,不依赖于计算机。

对3. 线性结构反映结点间的逻辑关系是一对一的。

对4. 一维向量是线性表,但二维或N维数组不是。

错5. “同一数据逻辑结构中的所有数据元素都具有相同的 特性”是指数据元素所包含的数据项的个数都相等。

错 插入概率p(i)=1/(n+1) ,删除概率q(i)=1/n插入操作时间效率(平均移动次数)2)1(11)1(1111ni n n i n p E n i n i i is =+-+=+-=∑∑+=+=删除操作时间效率(平均移动次数)21)(1)(11-=-=-=∑∑==n i n n i n q E ni n i i dl 线性表顺序存储结构特点:逻辑关系上相邻的两个元素在物理存储位置上也相邻; 优点:可以随机存取表中任一元素;无需为表示表中元素 之间的逻辑关系而增加额外的存储空间;缺点:在插入、删除某一元素时,需要移动大量元素;表的容量难以确定,表的容量难以扩充。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

稳定排序和不稳定排序
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。

本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。

首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。

在简单形式化一下,如果Ai = Aj,Ai 原来在位置前,排序后Ai还是要在Aj位置前。

其次,说一下稳定性的好处。

排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。

基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其顺序再高位也相同时是不会改变的。

另外,如果排序算法稳定,对基于比较的排序算法而言,元素交换的次数可能会少一些(个人感觉,没有证实)。

回到主题,现在分析一下常见的排序算法的稳定性,每个都给出简单的理由。

(1)冒泡排序
冒泡排序就是把小的元素往前调或者把大的元素往后调。

比较是相邻的两个元素比较,交换也发生在这两个元素之间。

所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

(2)选择排序
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n - 1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。

那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。

比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

(3)插入排序
插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。

当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。

比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。

所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

(4)快速排序
快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_inde x是中枢元素的数组下标,一般取为数组第0个元素。

而右边的j下标一直往左走,当a[j] > a[c enter_index]。

如果i和j都走不动了,i<= j,交换a[i]和a[j],重复上面的过程,直到i> j。

交换a[j]和a[center_index],完成一趟快速排序。

在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列为5 3 3 4 3 8 9 10 11,现在中枢元素5和3(第5个元素,下
标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,不稳定发生在中枢元素和a[j] 交换的时刻。

(5)归并排序
归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。

可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。

那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。

所以,归并排序也是稳定的排序算法。

(6)基数排序
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。

有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

基数排序基于分别排序,分别收集,所以其是稳定的排序算法。

(7)希尔排序(shell)
希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。

所以,希尔排序的时间复杂度会比O(n^2)好一些。

由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

(8)堆排序
我们知道堆的结构是节点i的孩子为2 * i和2 * i + 1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。

在一个长为n 的序列,堆排序的过程是从第n / 2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。

但当为n / 2 - 1,n / 2 - 2, ... 1这些个父节点选择元素时,就会破坏稳定性。

有可能第n / 2个父节点交换把后面一个元素交换过去了,而第n / 2 - 1个父节点把后面一个相同的元素没有交换,那么这2个相同的元素之间的稳定性就被破坏了。

所以,堆排序不是稳定的排序算法。

综上,得出结论: 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。

相关文档
最新文档