Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208250
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 824
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-12 21:40
个人简介

只有今天的埋头,才有明天的出头。

文章分类

全部博文(80)

文章存档

2014年(80)

我的朋友

分类: C/C++

2014-10-24 19:00:36

定义:排序是计算机内经常进行的一种操作,其目的是将一组无序的数组元素调整为有序的数组元素。假设含n个数据元素的序列为{R1R2…,Rn}其相应的关键字序列为{K1K2….,Kn}z这些关键字相互之间可以进行比较,存在这样一个关系Kp1<=Kp2<=…<=Kpn按此固有关系将上式记录序列重新排列为{Rp1Rp2…,Rpn}

的操作称作排序。

稳定性:如果在序列中有两个数据元素r[i]r[j]他们的关键字k[i]=k[j],且在排序之前对象r[i]r[j]的前面,排序后对象r[i]仍在r[j]的前面,称这个排序方法是稳定的。

关键操作:比较、交换

多关键字排序:只要在比较操作时同时考虑多个关键字即可,与单关键字无本质区别

分类:

内排序-整个排序过程不需要访问外存便能完成。

外排序-待排序的数据元素数量很大,整个序列的排序过程不可能在内存中完成。

审判:

时间性能-关键性能差异体现在比较和交换的数量;

辅助存储空间-为完成排序操作需要额外的存储空间必要时可以空间换时间;

算法的实现复杂性-过于复杂的排序法会影响代码的可读性和可维护性,也可能影响排序的性能。

方法:

选择排序:每一趟(例如第i趟)在后面n-i个待排的数据元素中选出关键字最小的元素,作为有序元素序列的第i个元素。从第0趟开始。

插入排序:当插入第ii>=1)个数据元素时,前面的v[0],v[1],…,v[i-1]已经排好序,这时用v[i]的关键字与v[i-1],v[i-2],…的关键字进行比较,找到插入位置即将v[i]插入,原来位置上的对象向后顺移。

冒泡排序:设待排数据元素序列中的元素个数为n最多做n-1趟,i=1,2,…,n-1.在第i趟中从后向前,j=n-1,n-2,…,i,亮亮比较v[j-1]v[j]的关键字,如果发生逆序,则交换v[j-1]v[j].

上面这3种算法时间复杂度为On*n,排序结果稳定。

希尔排序:将待排序列划分为若干组,在每一组内进行插入排序,以使整个序列基本有序,然后再对整个序列进行插入排序。

快速排序:任取待排序序列中的某个数据元素(例如:第一个元素)作为基准,按照该元素的关键字大小将整个序列划分为左右两个子序列:左侧子序列所有元素都小于或等于基准元素,右侧子序列中所有元素都大于基准元素,基准元素排在这两个子序列中间。分别对这两个子序列重复施行上述方法,直到所有的对象排在相应的位置上为止。

归并排序:将两个或两个以上的有序序列合并成一个新的有序序列(2路归并、3路归并、多路归并)当ij都在两个序列内变化时,根据关键码的大小将较小的数据元素排放到新序列k所指的位置中,当ij有一个已经超出序列时,将另一个序列中的剩余部分照抄到新序列中。

上面3种排序复杂度提高到了O(n*logn),除归并排序结果稳定之外其他不稳定。

阅读(1395) | 评论(0) | 转发(0) |
0

上一篇:线性表

下一篇:二叉树

给主人留下些什么吧!~~