下面这个专题我想主要总结一些各种不同的排序
来源:互联网 发布:ae软件下载官方中文版 编辑:程序博客网 时间:2024/06/06 02:07
排序这个问题不管是什么语言都可以说是一个永远的问题,不同的排序方法适应的环境和算法的效率有所不同。下面我将逐一介绍常见的几种排序算法,如有什么不对的地方希望大家积极的跟我讨论。
首先介绍一下排序的稳定性:
例:
编号总分1555243434564555按总分排序以后:编号总分1555455534562434这个排序就是稳定的。而这个排序就是不稳定的:
编号总分4555155534562434关于排序其它的方面就不多叙述了,直接进入我们今天的主题:首先是经典的冒泡排序。它的时间复杂度是O(n).
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
实现代码是:
<pre name="code" class="cpp">void bubblesort(sqlist *l){int i,j;for(i=0;i<l->length;i++){for(j=i+1;j<=l->length;j++){if(l->r[i]>l->r[j]){swap(l,i,j);}}}}
这个算法严格来说不是正宗的冒泡法,但是由他可以得出冒泡法的原型,它最大的缺点就是效率低。
void bubblesort(sqlist *l){int i,j;for(i=0;i<l->length;i++){for(j=l->length-1;j>=i;j--){if(l->r[j]>l->r[j+1]){swap(l,j,j+1);}}}}通过这两个算法,我们大致可以看出他们之间的差别。
当i=2的时候,变量j由8反向循环到2,逐个比较,在将关键字2交换到第二个位置的同时,也将关键字4和3有所提升,比第一种方式的效率有所提升。
但是这两种方法均有一个缺陷,加入这样一个序列{2,1,3,4,5,6,7,8,9},在交换完第一次之后,序列已经变成有序的,再比较就没有意义,因此大神又想到了解决的方法,看看下面的算法:
void bubblesort(sqlist *l){int i,j;Status flag=true;for(i=0;i<l->length&&flag;i++){flag=false;for(j=l->length-1,j>=i;j--){if(l->r[j]>l->r[j+1]){swap(l,j,j+1);flag=ture;}}}}这个算法就省去了之前的困难,它增加一个标志,比较8和7,7和6...2和1如果均满足后者比前者大就不需要排序了。
0 0
- 下面这个专题我想主要总结一些各种不同的排序
- 下面是EntityManager的一些主要的接口要领
- 各种排序的总结
- 我想问一些关于red5直播的问题,下面我的详细情况
- 这个帖子主要总结数据库备份方面的问题
- 排序的一些总结
- 排序:一些排序的总结
- 各种内部排序的总结
- 各种排序算法的总结
- 各种排序算法的总结
- 各种排序算法的总结
- 排序专题总结
- LintCode-排序专题总结
- 排序专题总结
- 排序问题专题总结
- 一些我想干的活
- informix和oracle的一些不同总结
- 一些排序算法的总结
- Object-c基础编程学习笔记-NSString
- linux上安装tomcat,配置tomcat服务开机自启动
- 排序算法
- 学习Spring必学的Java基础知识(5)----注解
- 自定义实现RatingBar
- 下面这个专题我想主要总结一些各种不同的排序
- 限制恶意轰炸注册的妙招
- 测试用例设计白皮书--边界值分析方法
- Android上的否认和欺骗
- 模板消息接口文档
- OK6410(s3c6410)存储之MMU(内存管理单元)
- ios-实现本地通知(UILocalNotification)
- favicon add in wordpress
- js暂停(休眠)代码一段时间后继续执行代码