排序算法整理(啊哈算法)

一、桶排序

这是一个非常快的排序算法。桶排序从1956年就开始被使用,该算法的基本思想是由

  E.J.Issac 和R.C.Singleton 提出来的。之前我说过,其实这并不是真正的桶排序算法,真正的

  桶排序算法要比这个更加复杂。

示例:数组 {5, 3, 5, 2, 8} 进行排序(已知最大数值不会超过 10)

 

  代码如下:

  

  总结:排序很快,但是性能损耗很大,对未知大小的数组无法使用,同时浮点型的排序难度非常大。

二、经典排序冒泡

冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换 过来。

代码如下:

 

总结:经典排序算法,两个 for 循环,临时变量更换数组位置从而达到排序目的;

三、快速排序

冒泡排序可以说是我们学习的第一个真正的排序算法,并且解决了桶排序浪费 空间的问题,

但在算法的执行效率上却牺牲了很多,它的时间复杂度达到了O(N ²) 。

假如我 们的计算机每秒钟可以运行10亿次,那么对 1 亿个数进行排序,桶排序只需要 0.1秒,

而冒 泡排序则需要1 千万秒,达到 115 天之久,是不是很吓人?

那有没有既不浪费空间又可以快 一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢?

示例:数组 {6, 1, 2, 7, 9, 3, 4, 5, 10, 8}

思路: 两端开始“探测”。先从 右往左找一个小于6 的数,再从左往右找一个大于6 的数,然后交换它们。

这里可以用两个 变量 i 和 j ,分别指向序列最左边和最右边。

我们为这两个变量起个好听的名字“哨兵 i ”和 “哨兵j”。

刚开始的时候让哨兵 i 指向序列的最左边(即 i =1),指向数字 6。让哨兵 j 指向序列的最右边(即j =10 ),指向数字 8 。

如图解:

 

  

 

 



示例代码:

 

总结:其实快速排序是基于一 种叫做“二分”的思想。

注解:

快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候

设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全

部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进

行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当

然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和

冒泡排序是一样的,都是 O(N²),它的平均时间复杂度为 O ( N logN )。

时间: 2024-10-08 17:22:51

排序算法整理(啊哈算法)的相关文章

算法整理(二)---高速排序的两种实现方式:双边扫描和单边扫描

首先简单谈下高速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).由于用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法.基本思想是分治法,这位大大的http://blog.csdn.net/morewindows/article/details/6684558 讲的很清楚了,分治法+挖坑法,我就不多说了.就是以某个数为參照,使得左边的都小于他,右边的数都大于他.然后对他的左右两个区间採取相同的方法进行递归. 就其总体

算法整理(三):插入排序

插入排序很简单,就像打扑克.手里有个牌4,再来一张牌5就本能的放到第一个牌的右边.如果来了个3就从右往左扫描,只要左边的比这个待插入数字大就交换. 插入排序是一种稳定的排序方法,时间复杂度O(n*n),空间复杂度O(1),最好的情况下时间复杂度为O(1).即本来就是一个有序或者相等的数组,则只需比较n-1次即可.下为源码,只需三行代码即可. //============================================================================

算法整理(四):浅析快速排序的优化问题

前文介绍了快速排序的单边扫描和双边扫描,但么有做对比,今天来简单分析下. 一.单边扫描的缺点 单边扫描最大的缺点是每次都要交换,如果一个数组是 5 4 3 2 1,用单边扫描的话,则从4开始,4要和4交换一次,3要和3交换一次,依次类推,这种无意义的操作.正因此用双边扫描会更好,第一趟只需交换一次,就能得到1 4 3 2 5这样的数组.但双边扫描也是可以进一步优化的. 二.双边扫描的优化 优化一:对key值得选取应该使用随机选取的原则,而非第一个数字.意义大家都懂得. 优化二:前文的方法是挖坑法

算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描

首先简单谈下快速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).因为用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法.基本思想是分治法,这位大大的http://blog.csdn.net/morewindows/article/details/6684558 讲的非常清楚了,分治法+挖坑法,我就不多说了.就是以某个数为参照,使得左边的都小于他,右边的数都大于他.然后对他的左右两个区间采取同样的方法进行递归. 就其整

常见数据结构与算法整理总结(下)

这篇文章是常见数据结构与算法整理总结的下篇,上一篇主要是对常见的数据结构进行集中总结,这篇主要是总结一些常见的算法相关内容,文章中如有错误,欢迎指出. 一.概述 二.查找算法 三.排序算法 四.其它算法 五.常见算法题 六.总结 一.概述 以前看到这样一句话,语言只是工具,算法才是程序设计的灵魂.的确,算法在计算机科学中的地位真的很重要,在很多大公司的笔试面试中,算法掌握程度的考察都占据了很大一部分.不管是为了面试还是自身编程能力的提升,花时间去研究常见的算法还是很有必要的.下面是自己对于算法这

最短路径算法整理(二)

本文是最短路径算法整理的第二篇,想阅读第一篇的朋友能够点击下面链接: http://blog.csdn.net/hjd_love_zzt/article/details/26739593 这一篇博客继续以一些OJ上的题目为载体,整理一下最短路径算法.会陆续的更新... 1.HDU 2544 题目与分析:这道题抽象一下,还是:"求a到b的最短路径"..所须要的基本条件是:点数.边数.起点.终点 下面给出floyd.dijkstra.bellmanford三种最短路径算法关于这道题的解法:

常见数据结构与算法整理总结(上)

数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作.算法是为求解一个问题需要遵循的.被清楚指定的简单指令的集合.下面是自己整理的常用数据结构与算法相关内容,如有错误,欢迎指出. 为了便于描述,文中涉及到的代码部分都是用Java语言编写的,其实Java本身对常见的几种数据结构,线性表.栈.队列等都提供了较好的实现,就是我们经常用到的Java集合框架,有需要的可以阅读这篇文章.Java - 集合框架完全解析 一.线性表 1.数组实现 2.链表 二.栈与队列 三.树

(最短路径算法整理)dijkstra、floyd、bellman-ford、spfa算法模板的整理与介绍

这一篇博客以一些OJ上的题目为载体.整理一下最短路径算法.会陆续的更新... 一.多源最短路算法--floyd算法 floyd算法主要用于求随意两点间的最短路径.也成最短最短路径问题. 核心代码: /** *floyd算法 */ void floyd() { int i, j, k; for (k = 1; k <= n; ++k) {//遍历全部的中间点 for (i = 1; i <= n; ++i) {//遍历全部的起点 for (j = 1; j <= n; ++j) {//遍历

排序算法之 Java插入排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class Insert { public int[] sort(int[] arr){ if ( arr == null || arr.length <= 1 ){ return

算法8-10:最短路径算法之拓扑排序

该算法的基本思想就是按照拓扑排序的顺序依次将每个顶点加入到最短路径树中,每次加入时将该顶点延伸出的所有顶点进行"放松"操作.这种算法的复杂度是E+V. 代码 这种算法的代码比Dijkstra还要简单,代码如下: public class TopologySP extends SP { public TopologySP(EdgeWeightedDigraph G, int s) { super(G, s); // 将所有顶点到原点的距离设为无穷大 // 注意:下面这段代码不要遗漏 fo