武汉软件工程职业学院《数据结构讲义》第21讲排序

发布 2019-06-24 06:20:15 阅读 3844

1.掌握排序的基本概念。

2.掌握内部排序中的插入排序方法。

教学重点:内部排序中的插入排序方法。

教学难点:内部排序中的插入排序方法。

授课内容。排序(sorting)又称分类,是计算机程序设计中的一个重要操作,即把一批任意序列的数据元素(或记录),重新排列成一个按关键字有序的序列。通过排序可以提高数据表的直观性,并为以后查询提供方便,提高查找效率。

排序的应用领域十分惯犯,因此在很多领域有广泛应用。**簿、病历、情报、档案、图书馆和各种词典的目录表(或目录卡)等都离不开排序。

为了进一步理解排序,在此给出一个比较确切的排序定义:

假设含d个记录的序列为。

[r1 ,r2 ,…rd6.1.1)

其相应的关键字序列为。

k1 ,k2 ,…kd

需确定1,2,…,d的一种排列p1,p2,…,pd,使其响应的关键字满足下列的非递减(或非递增)关系:

kp1≤kp2≤…≤kpd6.1.2)

即使式(6.1.1)的序列成为一个按关键字有序的序列。

rp1 ,rp2 ,…rpd6.1.3)

这样一种操作成为排序。

在待排序的记录中若关键字值是唯一的(即ki是主关键字),则任何一组记录经排序后得到的结果是唯一的;在待排序的记录中若有两个或两个以上关键字值相同的记录,则排序的结果不唯一。在用某种方法排序之后,这些关键字相同的记录相对先后次序不变,即当ki=kj(1≤i≤d,1≤j≤d,i≠)且i排序的方法有多种,若按排序过程中所涉及的存储器不用,可奖排序方法分为两大类:一类是内部排序,即将待排记录调入计算机的内存中进行的排序过程,其排序方法包括插入排序、交换排序、选择排序、归并排序和基数排序等。

另一类是外部排序,即待排序记录的数量很大,以致内存不能依次容纳全部记录,在排序过程中尚需对外存访问的排序过程。

数据结构定义为:

#define maxsize 30

typedef structrcdtype;

rcdtype r[maxsize+1];

1.直接插入排序。

直接插入排序(straight insertion sort)是一种最简单的插入排序方法。它的基本操作是将一个记录插入到一个长度为n(假设)的有序表中,使之仍保持有序,从而得到一个新的长度为n+1的有序表。如同玩扑克牌的人抓牌一样,将抓到的牌插入到手重已排好的牌的一个适当位子上。

算法思路:设有彝族关键字;认为kl就是一个有序序列;让k2插入上述表长为1的有序序列中,使之成为一个表长为2的有序序列;让k3插入上述表长为2的有序序列中,使之成为一个表长为3的有序序列;依此类推,最后让kn插入到表厂为n-1的有序序列中,得到一个表长为n的有序序列。

void insertsort(rcdtype r[ ]int n)

r[j+1]=r[0];

2,折半插入排序。

当用直接插入排序进行到某一趟比较时,对于r[i].key来讲,前边i-1个记录已经按关键字排序。此时可不用直接插入排序的方法,而改用折半插入排序。

算法思路:与直接插入排序相近,只是在进行比较时,r[i].key首先与已排好序的中间记录进行比较,然后根据比较结果来确定r[i].

key继续与中间记录的前面记录比较,还是与中间记录的后面记录比较,找出应插入的位置,然后插入。算法如下:

void binsort(rcdtype r[ ]int n )

for(j=i-1;j>=low;j--)r[j+1]=r[j];

r[low]=r[0];

3.希尔排序。

希尔排序(shell sort)也称“缩小增量排序”。它的做法不是每次一个元素挨一个元素的比较。而是先将整个待排序记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录看承是一组,然后在各组内进行插入排序;接着取d2(d2=1),即所有记录成为一个组为止。

希尔排序对增量序列的选择没有严格规定,一般选d1约为n/2,d2为d1/2,d3为d2/2,…,di=1。

void shellsort(rcdtype r[ ]int n)

r[j+d]=r[0];

d=d/2;