数据结构-插入排序与选择排序

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

直接插入排序执行过程
初始 (49) 38 65 97 76 13 27
38 i=1
65 i=2 97 i=3 76 i=4 13 i=5 27 i=6
(38 49) 65 97 76 13 27 (38 49 65) 97 76 13 27 (38 49 65 97) 76 13 27
(38 49 65 76 97) 13 27 (13 38 49 65 76 97) 27 (13 27 38 38 49 65 49 65 76 97) 76 27 97 j j j j j j
练习:已知排序码{60,50,80,10,30,70},要求由
小到大排序,请分别写出直接插入排序、直接 选择排序的过程。
……
rn
直接插入排序
需解决的关键问题:
(1)如何构造初始的有序序列? (2)如何查找待插入记录的插入位置?
要点:
把元素集合划分为有序区和无序区

初始时,第一个元素默认构成有序区
每趟排序过程中,将无序序列的第一个元素
插入到有序序列的适当位置,以达到扩大有 序区长度的目的。
查找的方向:将待插入元素对有序区按照从后向 前的顺序比较查找其插入位置; 查找的标准:对有序区从后向前查找第一个不大 于待插入元素的记录位置,即在查找插入位置过 程中,若待插入元素小于当前有序区元素,则将 当前有序区元素后移。
直接选择排序算法是一种不稳定的排序算法;
直接选择排序算法简单、容易实现,适用于从
大量记录中选择一部分排序;
已知一组数据的排序码为: { 265,301,751,129,937,863,742,694,76,439 } 要求排序后数据从小到大排列,写出利用直接插入排序和 直接选择排序的过程 。
插入排序:直接插入排序、折半插入排序、希尔 排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 基数排序

排序算法的稳定性:假定在待排序的记录集中,
存在多个具有相同键值的记录,若经过排序, 这些记录的相对次序仍然保持不变,即在原序 列中,ki=kj且ri在rj之前,而在排序后的序列 中,ri仍在rj之前,则称这种排序算法是稳定 的;否则称为不稳定的。
129 129 129 129 76 76
265 265 265 265 129 129
751 751 751 301 301 301 301 301 265 265
129 129 129 751 751 751 742 694 301 301
937 937 937 937 937 863 751 742 694 439
我们后面讲的插入排序、交换排序、选择排序、
归并排序等都是指的内排序。
我们从以下几方面来学习每一种排序方法
思想
实现
时间性能
空间性能
稳定性 适用情况
插入排序
插入排序的基本思想是:将待排序表看做是左、右
两部分,其中左边为有序区,右边为无序区,整个 排序过程就是将右边无序区中的记录依次按关键字 大小逐个插入到左边有序区中,以构成新的有序区, 直到全部记录都排好序。 三种插入排序方法:直接插入排序、二分法插入排 序(也叫折半插入排序)和希尔排序。
直接选择排序
初始 265 301 第1趟 76 301 第2趟 76 129 第3趟 76 129
第4趟 第5趟 第6趟 第7趟 第8趟 第9趟
76 76 76 76 76 76
129 129 129 129 129 129
751 751 751 265 265 265 265 265 265 265
排序算法的性能指标
1.

Fra Baidu bibliotek
时间开销:
⑴比较:关键码之间的比较; ⑵移动:记录从一个位置移动到另一个位置。
2.

空间开销:
辅助存储空间
3.
算法的稳定性
内排序
定义
待排记录存放在随机存储器中进行(内存)
排序对象
针对关键字(排序码)的序列 排序算法缺省以顺序表为存储结构 非递减有序
min min
min
初始: [ 49
38
65
97 j
97
76 j
76
13 j
49
27 ] j min
27 ]
j j min
一趟: 13 [ 38 27 65
j
二趟: 13 [65
j
97
j
76
j
49
j
38 ]
三趟: 13
四趟: 五趟: 六趟: 13 13 13
27
27 27 27
38
38 38 38
直接插入排序
基本思想:将数据元素集合分成两部分,一部
分为有序区,一部分为无序区。每次从无序区 中取出一个数据元素,按其关键字大小将其插 入到有序区的适当位置上,直到全部数据元素 都插入到有序区中为止。
r1 r2
……
ri-1
ri
ri+1
……
rn
有序序列
r'1 r'2
……
无序序列
r'i-1 r'i ri+1

有序表:L[0]~
直接插入排序性能分析
排序中的两个基本操作是:
(关键字间的)比较和(记录的)移动。排序的时间 性能取决于排序过程中这两个操作的次数。 直接插入排序这两个操作的次数 操作次数取决于待排记录序列的状态, 当待排记录处于“正序” 的情况时,所需进行的关 键字比较和记录移动的次数最少, 当待排记录处于“逆序” 的情况时,所需进行的关 键字比较和记录移动的次数最多, 算法评价 时间复杂度:T(n)=O(n² ) 空间复杂度:S(n)=O(1)只使用i、j和tmp 3个辅助变 量,与问题规模n无关。
直接插入排序flash演示
void InsertSort(DataType L[],int len) struct Record { int i,j; { int data1; int data2; DataType tmp; int key; for(i=1;i<len;i++) }; typedef Record DataType; { //i代表排序次数 tmp=L[i]; ;//存放待插入元素 for(j=i-1;j>=0;j--)//有序表数据比较和移动 { if(tmp.key < L[j].key) // 关键字比较 L[j+1]=L[j]; // 记录移动 else break; } L[j+1]=tmp; //插入位置为j+1 } }
课本
直接选择排序
基本思想:将数据元素序列分成有序区和无序区
两部分。每趟排序都从无序区中选取出关键字最 小的数据元素放在有序区的最后,直到全部数据 元素排序完毕。 要点: 把元素集合划分为有序区和无序区

初始时,有序区为空
每趟排序过程中,从无序区中选出关键字最小
的数据元素与无序区的第一个元素交换,以达 到扩大有序区长度的目的。
863 863 863 863 863 937 863 751 742 694
742 742 742 742 742 742 937 863 751 742
694 694 694 694 694 694 694 937 863 751
76 76 76 76 76 76 76 76 937 863
439 439 439 439 439 439 439 439 439 937

直接插入排序算法是一种稳定的排序算法。
直接插入排序算法简单、容易实现,适用于待
排序记录基本有序或待排序记录较少时。 当待排序的记录个数较多时,大量的比较和移 动操作使直接插入排序算法的效率降低。
其它类型插入排序
二分法插入排序 希尔排序 二分法插入排序和希尔排序的算法实现请参照
初始 265 301 751 129 937 863 742 694 第1趟
76 439
第2趟 第3趟 第4趟 第5趟 第6趟 第7趟 第8趟 第9趟
直接插入排序
初始 265 301 第1趟 265 301 第2趟 265 301 第3趟 129 265
第4趟 第5趟 第6趟 第7趟 第8趟 第9趟

有序表:L[0]
直接选择排序性能分析
直接选择排序比较和移动的次数 无论记录序列的初始状态如何,比较次数均相同; 移动次数取决于待排记录序列的状态, 当待排记录处于“正序” 的情况时,所需进行的记 录移动的次数最少; 当待排记录处于“逆序” 的情况时,所需进行的记 录移动的次数最多; 算法评价 时间复杂度:T(n)=O(n² ) 空间复杂度:S(n)=O(1)只使用i、j、k和tmp 4个辅助 变量,与问题规模n无关。
[97
49 49 49
76
[76 65 65
49
97 [97 76
65 ]
65 ] 76 ] [97 ]
直接选择排序flash演示
void SelectSort(DataType L[],int len) { int i, j, min; DataType tmp; //临时变量,用于元素交换 for(i=0;i<len-1;i++) { //i+1为排序次数 min=i; for(j=i+1;j<len;j++) //查找最小元素 if(L[j].key<L[min].key) min=j; if(min !=i) { tmp=L[i]; L[i]=L[min]; L[min]=tmp; } } }
划分为两个表 (i>=0)
~L[i] (第i+1次排序后) 无序表:L[i+1]~L[ len-1 ] (第i+1次排序后) 两个循环 大循环 for(i=0; i<len-1; i++)
确定比较的新元素L[i],min=i 小循环 for(j=i+1; j<len; j++) 确定当前的最小值 排序前无序表最小值下标为 min
假定被排序的数据是由一组记录组成的表,而记录则由若干
个数据项组成,其中有一项可用来标识一个记录,称为关键 字项,该数据项的值称为关键字。关键字可用作排序算法的 依据。也称为排序码。
排序分类
按待排序记录所在位置
内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序

按排序依据原则
划分为两个表 (i>=1)
L[i-1] (第i次排序前) 无序表:L[ i ]~L[ len-1 ](第i次排序前) 两个循环 大循环 for(i=1;i<len;i++)
确定插入到有序表的新元素L[i] 小循环 for(j=i-1;j>=0;j--) 有序表排序 新元素L[i]插入在j+1位置上 j的起始位置是i-1,终止位置为-1或第一个符合 tmp.key >= L[j].key的位置
694 694 694 694 694 694 863 863 751 751
76 265 265 751 751 751 751 751 863 863
439 439 439 439 439 937 937 937 937 937
小结
掌握排序算法的概念、种类
掌握直接插入排序、直接选择排序。
排序
排序的基本概念 直接插入排序 直接选择排序
排序基本概念
定义
排序是将无序的记录序列调整为有序记录序
列的一种操作。例如, 将下列记录序列 { 52, 49, 80, 36, 14, 58, 61, 23, 97, 75 } 调整为序列 { 14, 23, 36, 49, 52, 58, 61, 75, 80, 97 } 关键字(key)
129 129 301 301 301 301 301 301 301 301
937 937 937 937 937 439 439 439 439 439
863 863 863 863 863 863 694 694 694 694
742 742 742 742 742 742 742 742 742 742
相关文档
最新文档