当前位置:文档之家› 数据结构第八章 排序知识交流

数据结构第八章 排序知识交流


内部排序 方法
插入排序 选择排序
直接插入排序
折半插入排序 ……
简单选择排序 堆排序
数据结构
冒泡排序 交换排序 快速排序
归并排序
8.2 插入排序
数据结构
插入排序(Insertion Sort)的基本思想: 每次将一个待排序的记录,按其关键字的大小插入到前面 已经排好序的有序序列中的适当位置上,直到全部记录插入完 成为止。 根据具体插入方法的不同,插入排序可分为以下几种:
/*将r[i]暂时存到r[0]*/
low=1;
high=i-1; /*置有序序列区间的初值*/
while(low<=high)
/*在r[low]到r[high]中折半查找插入位置*/
{ m=(low+high)/2; /*折半,取中间位置送m*/
if(r[0]<r[m])
high=m-1;
/*插入位置在低半区*/
数据结构
例如: 对如下序列按照关键字由小到大排序: ( 42 20 17 13 28 14 23 15 )
简 (1) [42 ] 20 17 13 28 14 23 15 单 (2) [20 42] 17 13 28 14 23 15 插 (3) [ 17 20 42 ] 13 28 14 23 15 入 (4) [ 13 17 20 42 ] 28 14 23 15 排 (5) [13 17 20 28 42 ] 14 23 15 序 (6) [13 14 17 20 28 4 2] 23 15
一趟折半插入排序的步骤为: (1)初始化 将待插入的记录存入r[0]中:r[0]←r[i]; 给指定查找区间上下界指针赋值:low←1,high ←i-1; (2)折半查找插入位置; (3)将插入位置后面的记录依次后移一个位置; (4)将暂存在r[0]中的待插入记录放入找到的位置
上。
8.2 插入排序
/*第一个数是有序的,为初始有序序列,i从2开始*/
if(r[i]<r[i-1]) /*如“<”,需将r[i]插入到前面有序序
列中,否则r[i]不需要插入,保持原来位置*/
{r[0]=r[i];
/*r[i]的值放入监视哨中*/
for(j=i-1;r[0]<r[j];--j)
/* j为待比较元素下标,初始时指向待插入元素前一个单元*/
但直接插入排序算法是一种稳定算法(如果排序后具 有相同关键字的记录仍维持排序之前的相对次序,则称之 为稳定的,否则称为不稳定的。)
8.2 插入排序
数据结构
8.2.2 折半插入排序
折半插入排序是对直接插入排序的改进算法,它是 利用折半查找来实现插入位置的定位,因为折半查找的效 率比较高,因此可以减少排序过程中的比较次数。适用于 待排序的记录数量较大的情况。
数据结构
main()
{ int i,j,low,high,m;
/*low,high,m表示查找的上下界和中间位置*/
int r[9]={0, 42,20,17,13,28,14 ,23,15 };
for(i=2;i<=8;++i) /*r[1]是有序的,从r[2]开始排序*/
{ r[0]=r[i];
(7) [13 14 17 20 23 28 42] 15
(8) [13 14 15 17 20 23 28 20]
8.2 插入排序
数据结构
main()
{ int i,j;
int r[9]={0,42,20,17,13,28,14 ,23,15 };
/*r[0]存放每次待插入的记录*/
for(i=2;i<=8;++i)
数据结构
数据结构第八章 排序
第8章 排 序
数据结构
8.1 排序的基本概念 8.2 插入排序 8.3 选择排序 8.4 交换排序 8.5 归并排序
8.6 基数排序 8.7 几种排序方法的比较
8.1 排序的基本概念
数据结构
• 将一组杂乱无序的数据元素(记录)按一定的规 律顺次排列起来叫做排序(sort)。
r[j+1]=r[j];
/*记录后移*/
r[j+1]=r[0];
/*插入到正确位置*/
}
for(i=1;i<=8;i++) printf("%d ",r[i]);
}
8.2 插入排序
数据结构
直接插入排序算法简单、容易实现,其算法的时间复 杂度是O(n2)。
当待排序记录较少时,排序速度较快,反之,当待排 序的记录数量较大时,大量的比较和移动操作将使直接插 入排序算法的效率降低。
else
low=m+1;
/*插入位置在高半区*/
}
8.2 插入排序
数据结构
for(j=i-1;j>=high+1;--j)
Байду номын сангаас
r[j+1]=r[j]; /*插入位置以后的记录后移*/
r[high+1]=r[0];
/*插入记录*/
}
for(i=1;i<=8;i++)
printf("%d ",r[i]); /*输出排序后的有序序列*/
直接插入排序----希尔排序 折半插入排序---- 2ˉ路插入排序
8.2 插入排序
数据结构
8.2.1 直接插入排序
直接插入排序(Straight Insertion Sort)是一种最 简单的排序方法,它的基本操作是依次将记录序列中的每 一个记录插入到有序序列中,使有序序列的长度不断地扩 大。
其具体的排序过程可以描述如下: 首先将待排序记录序列中的第一个记录作为一个有 序序列,将待排序记录序列中的第二个记录插入到上述有 序序列中形成由两个记录组成的有序序列,再将待排序记 录序列中的第三个记录插入到这个有序序列中,形成由三 个记录组成的有序序列,如此进行下去,直到最后一个记 录也插入完成。
• 对一批记录的排序,应该指定是根据记录中哪个 域的数据进行排列。这个作为排序依据的数据域我们 称之为关键字(key)。
• 排序方法:
–大多数的排序方法,数据是存储在内存中,并 在内存中加以处理的,这种排序方法叫内部排 序。
–如果在排序过程中,数据的主要部分存放在外 存储器中(如软盘、硬盘、磁带),借助内存 进行内、外存数据交换,逐步排列记录之间的 顺序,则称之为外部排序。
}
折半插入排序仅仅减少了关键字间的比较次数,而记 录的移动次数不变。因此折半插入排序的时间复杂度仍为 O(n2)。它也是一种稳定的算法
8.3 选择排序
数据结构
选择排序(Selection Sort)的基本思想是: 每一趟从待排序的序列中选出关键字最小的记录,顺序 放在已排好序的子序列的最后,直到全部记录排序完毕。 常用的选择排序方法有简单选择排序和堆排序。
相关主题