数据结构学习18——排序的综述

来源:互联网 发布:linux系统自带rpm在哪 编辑:程序博客网 时间:2024/06/06 00:44

所谓排序,就是整理文件中的记录,使之按关键字递增(或递减)的顺序排列起来。其定义如下:

输入:n个记录R1、R2、R3.....Rn,其相应关键字分别为K1、K2、K3......Kn。

输出:Ri1、Ri2、Ri3......Rin,使得Ki1《Ki2《Ki3《......《Kin

1:被排序对象——文件

被排序对象——文件由一组记录组成

记录则由若干个数据项(或域)组成。其中一项可用来标识一个记录,称之为关键字(Key)

2:排序的依据

用来做排序运算的关键字,可以是数字类型,也可以是字符类型

3:排序的稳定性

当待排序记录的关键字均不相同时,排序结果是唯一的,否则排序结果不唯一

排序方法稳定:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,则该方法稳定

排序方法不稳定:若具有相同关键字的记录之间的相对次序发生了变化,则这种方法是不稳定的。

4:待排文件的常用存储方式

1)以顺序表作为存储结构

排序过程:对记录本身进行物理重排,即通过关键字之间的比较判定,将记录移到合适的位置。

2)以链表作为存储结构

无须移动记录,仅需修改指针。通常将这类排序称之为链式排序

3)以顺序的方式存储待排序的记录,但同时建立一个辅助表(如包括关键字和指向记录位置的指针组成的索引表)

排序过程:只需对辅助表进行物理重排

经典排序算法:

1:快速排序

基本思想:通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

快速排序的基本知识:http://blog.csdn.net/gzbaishabi/article/details/37691839


2:希尔排序(shell排序)

基本思想:先取第一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组里。先在各组内警醒直接插入排序,然后,取第二个增量d2<d1重复上述的分组和操作,直至所取得的增量dt=1(dt<dt-1<....<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

其实上述的理解方式比较困难的:其实通俗的理解就是 ,人为的加一个间隔d1,将1与1+d1进行比较,2与d1+2进行比较,依次类推,最后的结果就是大体上有序,即较小的数在前半部分,较大的数在后半部分。这样就不用实现一步步的向前移动,而实现的跨越式的移动。

d1怎么来?

具体的我们可以假设一个待排序的数组长度为length,假设d1=length/3+1;

接着我们用do—while来实现跨越式交换:

void ShellSort(Sqlist *L,int length){int i,j;int increment=length;do{increment=increment/3+1;for(i=increment+1;i<length;i++){if(r[i]<r[i-icrement]){r[0]=r[i];for(j=i-icrement;j>0&r[0]<r[j];j-=increment)r[j+increment]=r[j];r[j+increment]=r[0];//实现两个跨越数据的交换}}}while(increment>1);}

上面是如何实现d2的?

上面的可知,执行do后,increment=increment/3+1;假设increment初始值为9,此时结束后increment==4;

while(4>1)继续执行do,此时increment=4/3+1;此时increment=2进行跨越式交换。以达到排序的效果。

这就是希尔排序的基本思想。具体实现:http://blog.csdn.net/gzbaishabi/article/details/37564477


问题描述:请用C/C++写出一个shell排序的程序,要求输入10个数,输出排序结果。

我们就先用我们学习的算法思路进行操作,之后再进行算法思路的拓展。

先用do-while解决:
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

0 0