- 浏览: 308285 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (272)
- java (42)
- c (49)
- 算法 (29)
- 汇编语言 (3)
- 字符集 (3)
- error (3)
- 搜索引擎 (2)
- 互联网 (18)
- linux (12)
- 网络 (20)
- VMWare (1)
- 面试 (7)
- c++ (55)
- 设计模式 (3)
- db (9)
- office (2)
- FS (1)
- rest (3)
- Ajax (2)
- Spring (2)
- Hibernate (3)
- matlab (1)
- load balancing (8)
- 分布式计算 (2)
- 易语言 (1)
- apache tomcat (1)
- 测试 (1)
- 数据结构 (5)
- 数学 (13)
- 服务器 (9)
- 读后感 (4)
- 好书介绍 (1)
- script (3)
- wordpress (2)
- delphi (21)
- pascal (8)
- xml (3)
- 趣味 (1)
- PHP (3)
- python (13)
- DLL (4)
- openGL (8)
- windows (2)
- QT (28)
- django (7)
- jquery (1)
- 数据挖掘 (7)
- nginx (1)
- js (1)
- mac (1)
- hadoop (3)
- 项目管理 (1)
- 推荐系统 (1)
- html (1)
最新评论
-
晴天1234:
related remove:attention.ibus和u ...
UBUNTU的默认root密码是多少,修改root密码 -
美丽的小岛:
美丽的小岛 写道如上配置好就得了。提示没有OpenGl.dll ...
OpenGL学习入门之VS2010环境配置 [转] -
美丽的小岛:
如上配置好就得了。提示没有OpenGl.dll之类的,再增加入 ...
OpenGL学习入门之VS2010环境配置 [转] -
美丽的小岛:
主要是理清哪两个对象之间的关系,是信号与所有槽的关系或者是槽与 ...
QT之DisConnect -
美丽的小岛:
LPCTSTR类型:L表示long指针 这是为了兼容Windo ...
QString与各种字符串之间的转化
根据排序的原则,内排序可以分为:
- 插入排序
- 交换排序
- 选择排序
- 归并排序
预备知识:
1.等差数列之和:S=n*(a1+an)/2
等比数列之和:S=a1(1-q^n)/(1-q)
2.使用哨兵提高效率
比如基本的顺序查找我们可以这样做:
int search(int a[],int n,int key){ for(int i=0;i<n;i++) if(a[i]==key) return i+1; //返回第几个,而不是返回下标 return 0; //返回0说明没有找到 } |
注意到每次for循环都对边界进行检查(i<n),使用哨兵就不需要进行边界检查.
int search(int a[],int n,int key){ a[0]=key; for(int i=n;a[i]!=key;i--); return i; } |
但是使用哨兵的前提是在数组中a[1]--a[n]存储的是实际的元素,a[0]是拿来做哨兵的,即a的长度是n+1.
3.time()返回从1970年1月1日到现在的秒数,是实际时间。
clock返回开启进程和调用clock()之间的的CPU时钟计时单元(clock tick)数,不包括显式调用sleep()的时间,常用来测试任务执行的速度。
插入排序
简单插入排序
非常的简单,想想你玩牌的时候一边起牌,一边就把牌排好序了,那就是插入排序.
时间复杂度:O(N^2),1+2+...+(N-1)=N^2/2。这是最坏的情况,其实大致上说插入排序的平均情况和最坏情况一样差。
空间上来讲,任一时刻最多只有一个数字在存储数组之外,属于原地排序,O(1)。
稳定的排序.
希尔排序
希尔排序利用利用了插入排序的两个特点:
- 基本有序时直接插入排序最快
- 对于数据很少的无序数列,直接插入也很快
谢尔排序的时间复杂度在O(nlogn)和O(n^2)之间,空间复杂度为O(1).
为了使集合基本有序,而不是局部有序,不能简单地逐段分割,而应将相距为某个”增量”的元素组成一个子序列.通常取增量为d1=n/2,di+1=di/2.
交换排序
冒泡排序
把待排序的序列分为有序区和无序区,每次把无序区最大的数放到无序区的最后面,这样无序区的末元素成为有序区的首元素.
时间复杂度为O(n^2),空间复杂度O(1).
快速排序
快速排序是对冒泡排序的改进,由于冒泡排序是不断比较相邻元素然后进行交换,需要比较移动多次才能到达最终位置.而快速排序的比较和移动是从两端向中间进行,因而元素移动的距离较远.
初始主轴的选取采用三元取中法.经过N趟排序,当元素已基本有序后采用直接插入排序法.
理想情况下,每次划分左右两侧的序列长度是相同的,长度为n的序列可划分为logn层.定位一个元素要对整个序列扫描一遍,所需时间为O(n),总的时间复杂度为O(nlogn).
如果每次都取最左边的元素作主轴,最坏情况下待排序列完全有序(正序或逆序),每次划分只得到比上一次少一个的子序列,总的比较次数为1+2+3+...+(n-1)=O(n^2).
平均来说快速排序的时间复杂度为O(nlogn),栈的深度为O(logn).
快速排序是一种不稳定的排序算法.
选择排序
简单选择排序
简单选择排序和冒泡排序很像,每趟排序把把无序序列中最小的元素放到有序列的最后面,有序序列在前,无序序列在后.但有一个重要的区别:冒泡排序在一趟排序中边比较,边交换;而简单选择排序在一趟排序中只作一次交换.
简单选择排序是稳定的,时间复杂度为O(n^2),空间复杂度为O(1).
堆排序
堆排序是对简单选择排序的改进,在简单选择排序中前一次的比较结果没有保存下来,后一趟排序中反复对以前已经做过的比较重新做了一遍.
时间复杂度为O(nlogn),不稳定的排序.
归并排序
二路归并(用内存太多了,不用了。)
总结
排序方法 |
平均情况 |
最好情况 |
最坏情况 |
辅助空间 |
稳定性 |
直接插入 |
O(n^2) |
O(n) |
O(n^2) |
O(1) |
是 |
希尔 |
O(nlogn)~O(n^2) |
O(n^1.3) |
O(n^2) |
O(1) |
否 |
冒泡 |
O(n^2) |
O(n) |
O(n^2) |
O(1) |
是 |
快速 |
O(nlogn) |
O(nlogn) |
O(n^2) |
O(nlogn)~O(n) |
否 |
简单选择 |
O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
是 |
堆排序 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
O(1) |
否 |
归并 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
O(n) |
是 |
注:冒泡排序采用pos来标记已有序的序列位置后,最好情况才是O(n),如果没有采用此改进算法,最好情况也是O(n^2).我们的快速排序每次都把主轴放在vec[0]中,没用另外使用单独的变量,所以辅助空间为O(1),否则就是O(nlogn)~O(n).
http://www.cnblogs.com/zhangchaoyang/articles/1812997.html
发表评论
-
Apriori算法
2014-12-15 12:56 667http://blog.csdn.net/lizhengn ... -
编辑距离算法
2014-08-14 00:02 975字符串编辑距离: 是一种字符串之间相似度计算的方法。给定两个 ... -
八叉树及K-D树的应用和实现
2014-07-31 19:51 21521. 八叉树、k-d树的原理 2. 八叉树、k-d树的应用 ... -
四叉树与八叉树
2014-07-31 19:37 1407前序 四叉树或四元树也被称为Q树(Q-Tree)。四叉树 ... -
自行车往哪个方向行驶? <转>
2013-05-09 12:57 915文章转自: http://www.ma ... -
01虫子问题<转>
2013-05-09 12:26 732来自:http://www.cs.cmu.ed ... -
求数组中重复出现次数大于数组总个数一半的数
2013-04-17 21:39 1389变量设计,一个变量,存数num,另一个存这个数出现的次数ti ... -
约瑟夫环(时间复杂度为n)
2013-04-17 21:20 1828一、 题目描述: 约瑟夫环是一个数学的应用问 ... -
不用除法运算符的除法
2013-04-04 09:53 1818题目描述: 给定一数组a[N],我们希望构造数组b [N] ... -
泊松分酒趣题<转>
2013-03-24 11:40 813有一个12品脱(pint)的酒 ... -
二进制与三进制的那些趣题<转>
2013-03-24 11:20 14451. 小明是个卖苹果的 ... -
r-组合
2012-10-29 18:14 1001算法描述而下(来自组合数学): 从r-组合a1a2...ar ... -
全排列的实现(C)
2012-10-24 16:42 1129找工作,笔试经常会出现一个题,怎样生成一个集合内所有元素的全排 ... -
智力题
2012-09-06 16:17 1130不管是找工作还是考公 ... -
插入、堆排序
2012-08-21 21:15 0排序的最初数据结构是在线性表的基础上的,线性表这个东西就好像很 ... -
Hash求不成功查找<转>
2012-08-19 09:45 1392哈希表查找不成功怎么计算? 解答:先建好表,然后可以算出每个 ... -
基于二进制的集合(c语言)
2012-08-17 17:20 1021用C去操作集合,有时候觉得十分的麻烦,不过,集合又一定要用。苦 ... -
位运算<转>
2012-08-15 20:40 969什么是位运算? ... -
位运算求解N皇后的过程
2012-08-14 21:14 11578皇后可以用位运算来求,有点好奇的,不过,位运算这个强大的逻 ... -
一些hash函数实现<转>
2012-08-14 11:53 1312/** * Hash算法大全<br> * ...
相关推荐
### c# List<T>类排序方法 #### 一、初始工作与预备知识 在C#中,`List<T>`是一个非常常用的泛型集合类,它提供了动态数组的功能,可以存储任意数量的相同类型元素。当涉及到对List中的数据进行排序时,我们可以...
首先,`IList<T>`接口并没有直接提供排序方法。但是,我们可以通过以下两种方式对实现了`IList<T>`接口的对象进行排序: 1. 使用`Array.Sort()`或`List<T>.Sort()`方法: - `Array.Sort()`:这是静态方法,可以对...
这是一个通用的方法,可以对任何实现了`Comparable<T>`接口的集合进行排序。在我们的例子中,`String`类已经实现了`Comparable<String>`接口,因此我们可以直接对`List<String>`进行排序。然而,`Collections.sort()...
List<T>提供了许多便利的方法,如Add、Remove、Insert、IndexOf等,便于操作和管理列表。 ### 总结 在C#中,选择合适的集合类型取决于具体的需求。Array适用于已知大小且元素类型固定的情况;ArrayList在需要动态...
List<T>实现了多个接口,包括IList<T>、ICollection<T>、IEnumerable<T>、IList、ICollection和IEnumerable,从而提供了丰富的功能和方法。 泛型类的优势主要体现在提高了程序的类型安全性和性能。因为List<T>是强...
43<br><br>0061 树的实现 44<br><br>3.2 排序 48<br><br>0062 如何实现选择排序算法 48<br><br>0063 如何实现冒泡排序算法 49<br><br>0064 如何实现快速排序算法 50<br><br>0065 如何实现插入排序算法 ...
<br>第三部分 数值计算与趣味数学篇<br> <br>075 绘制余弦曲线和直线的迭加<br>076 计算高次方数的尾数 <br>077 打鱼还是晒网 <br>078 怎样存钱以获取最大利息 <br>079 阿姆斯特朗数 <br>080 亲密数 <br>081 自守数 ...
<br>17.3.4 添加缓存键依赖性 <br>17.3.5 建立绝对的过期策略 <br>17.3.6 建立变化的过期策略 <br>17.3.7 设置缓存条目优先级 <br>17.3.8 创建缓存回调方法 <br>17.4 小结 <br><br>第18章 应用程序跟踪和错误处理 ...
<br>17.3.4 添加缓存键依赖性 <br>17.3.5 建立绝对的过期策略 <br>17.3.6 建立变化的过期策略 <br>17.3.7 设置缓存条目优先级 <br>17.3.8 创建缓存回调方法 <br>17.4 小结 <br><br>第18章 应用程序跟踪和错误处理 ...
<br>17.3.4 添加缓存键依赖性 <br>17.3.5 建立绝对的过期策略 <br>17.3.6 建立变化的过期策略 <br>17.3.7 设置缓存条目优先级 <br>17.3.8 创建缓存回调方法 <br>17.4 小结 <br><br>第18章 应用程序跟踪和错误处理 ...
<br>17.3.4 添加缓存键依赖性 <br>17.3.5 建立绝对的过期策略 <br>17.3.6 建立变化的过期策略 <br>17.3.7 设置缓存条目优先级 <br>17.3.8 创建缓存回调方法 <br>17.4 小结 <br><br>第18章 应用程序跟踪和错误处理 ...
<br>17.3.4 添加缓存键依赖性 <br>17.3.5 建立绝对的过期策略 <br>17.3.6 建立变化的过期策略 <br>17.3.7 设置缓存条目优先级 <br>17.3.8 创建缓存回调方法 <br>17.4 小结 <br><br>第18章 应用程序跟踪和错误处理 ...
81<br>实例068 在ListView控件中对数据排序或统计 83<br>实例069 在ListView控件中绘制底纹 84<br>实例070 在列表视图中拖动视图项 85<br>实例071 用ListView控件选取整行数据 88<br>实例072 用ListView...
DTD子集 <br>5.5.3 有条件地忽略外部DTD子集<br> 的一部分 <br>5.6 把格式正确的文档转换为有效文档 <br>第6章 定义和使用实体 <br>6.1 实体定义和分类 <br>6.2 声明通用实体 <br>6.2.1 声明内部通用可分析型实体 ...
合并与分割 104<br>11.1 sort用法 104<br>11.1.1 概述 104<br>11.1.2 ...方法 108<br>11.1.13 使用k做分类键排序 108<br>11.1.14 指定sort序列 108<br>11.1.15 pos用法 108<br>11.1.16 使用head和tail将输出分类 109...
MYSQL高级特性 81<br>4.1 集合函数 82<br>4.1.1 行列计数 82<br>4.1.2...<br>4.2.5 比较日期和时间 92<br>4.3 字符串模式匹配 93<br>4.3.1 标准的SQL模式匹配 93<br>4.3.2 扩展正则表达式模式匹配 94<br>4.3.3 总结 ...
MYSQL高级特性 81<br>4.1 集合函数 82<br>4.1.1 行列计数 82<br>4.1.2...<br>4.2.5 比较日期和时间 92<br>4.3 字符串模式匹配 93<br>4.3.1 标准的SQL模式匹配 93<br>4.3.2 扩展正则表达式模式匹配 94<br>4.3.3 总结 ...
合并与分割 104<br>11.1 sort用法 104<br>11.1.1 概述 104<br>11.1.2 ...方法 108<br>11.1.13 使用k做分类键排序 108<br>11.1.14 指定sort序列 108<br>11.1.15 pos用法 108<br>11.1.16 使用head和tail将输出分类 109...
<br>第1章 Java基础 <br>1.1 转换基本数据类型 <br>1.2 Java的运算符 <br>1.3 控制程序的流程 <br>1.4 计算阶乘 <br>1.5 实现命令行程序 <br>第2章 Java面向对象程序设计 <br>2. 1 复数类 <br>2. 2 equals.chashCode...
数据和排序用字符集<br>5.10.2. 设置错误消息语言<br>5.10.3. 添加新的字符集<br>5.10.4. 字符定义数组<br>5.10.5. 字符串比较支持<br>5.10.6. 多字节字符支持<br>5.10.7. 字符集问题<br>5.10.8. MySQL服务器时区...