数据结构学习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解决:
- 数据结构学习18——排序的综述
- 【数据结构与算法】——排序综述
- 【数据结构与算法】——排序综述
- 图解数据结构---“内部排序”综述
- 基于排序学习的推荐算法研究综述
- 数据结构学习(十三)——插入排序
- 数据结构学习(十四)——选择排序
- 数据结构学习(十五)——冒泡排序
- 数据结构学习8——冒泡排序
- 数据结构学习11——堆排序
- 数据结构学习12——快速排序
- 【数据结构学习笔记】——排序
- 数据结构与算法学习——选择排序【使用上篇的冒泡排序】
- java数据结构学习笔记(一)综述
- 常用的排序算法综述
- 机器学习之排序学习综述
- 数据结构和算法————综述
- Python数据结构与算法1——综述
- Box2D v2.1.0用户手册(5)——动态模块(Dynamics Module)
- Populating Next Right Pointers in each Node
- 一口一口吃掉Struts(一)——用JSP+Servlet演示Struts的基本原理
- Android 编辑框(EditText)属性学习
- Struts2返回JSON数据的具体应用范例
- 数据结构学习18——排序的综述
- ArcGIS教程:网络元素
- lua学习24:《Lua程序设计(第2版)》第24章
- AC自动机zoj3228
- Kettle学习之Truncate then insert
- 十年磨一剑
- Box2D v2.1.0用户手册(6)——夹具(Fixtures)
- echart 地图 地图上的点 静态markPoint,动态markPoint
- 压力测试工具