排序算法(一):概述

排序算法(一):概述

排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列。

对于排序算法从以下几点去衡量算法的优劣:

  1. 时间复杂度,所谓时间复杂度就是将一组数从无序到有序所花费的时间,通常使用一个量级去衡量,比如O(n) 或者 O(n*n)
  2. 空间复杂度,所谓空间复杂度就是在排序过程中使用辅助空间的大小,通常也是使用一个量级去衡量,比如O(n) 或者 O(n*n)
  3. 是否稳定,所谓排序算法是否稳定的定义是对于相等的两个元素,在排序之后元素的位置是否互换,比如一个数组array array[i]与array[j]相等且(i<j),如果排序后array[i]与array[j]相互交换,我们则说这个排序是不稳定的,否则是稳定的。

对于排序算法的分类:

  1. 内部排序,所谓内部排序就是整个排序过程中都是在内存中,无需借助磁盘就可以完成排序,即为内部排序
  2. 外部排序,所谓外部排序就是数据量比较大,无法一次性将数据载入内存,需要内存与磁盘的多次数据交换才能完成的排序,即为外部排序

外部排序:

  1. 多路归并排序
  2. 败者树

内部排序:

  1. 插入排序:直接插入排序,希尔排序
  2. 选择排序:简单选择排序,堆排序
  3. 交换排序:冒泡排序,快速排序
  4. 归并排序
  5. 基数排序
  6. 桶排序
  7. 计数排序

排序算法整体印象图(来自网络截图),我们先对整体的排序算法一个概括,后续会详细的一一介绍

算法种类 排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 是否稳定
插入排序 直接插入排序算法  O(n2)  O(n)   O(n2)  O(1)  稳定
希尔排序算法  O(nlogn)  O(nlogn2)   O(nlogn2)  O(1) 不稳定 
选择排序 简单选择排序算法  O(n2)  O(n2)  O(n2)  O(1)  不稳定
堆排序  O(nlogn)  O(nlogn)  O(nlogn)  O(1)  不稳定 
交换排序 冒泡排序算法  O(n2)  O(n)   O(n2)  O(1)/无需  稳定
快速排序算法   O(nlogn)   O(nlogn)  O(n2)  O(logn)  不稳定
-- 归并排序算法  O(nlogn)  O(nlogn) O(nlogn)   O(n)  稳定
-- 基数排序算法  O(n*k)  O(n*k) O(n+k)   O(k)  稳定
-- 桶排序算法  O(n+k)   O(n+k)  O(n2  O(n+k)   稳定
-- 计数排序算法  O(n+k)   O(n+k)   O(n+k)   O(k)  稳定 

欢迎大家一块探讨

时间: 2024-11-08 22:58:19

排序算法(一):概述的相关文章

#排序算法#【1】概述、冒泡排序、选择排序

排序算法分类: 内部排序(在排序过程中不需要访问外存就可以完成排序) 外部排序 内部排序分类: 交换排序 冒泡排序 快速排序 选择排序 直接选择排序 堆排序 插入排序 直接插入排序 希尔排序 合并排序 外部排序: 常见的是多路归并算法,即将原文件分为多个能够一次装入内存一部分,分别把每一部分调入内存完成排序,然后对已经排序的子文件进行归并排序 冒泡排序法: 冒泡排序法是一种相邻数据交换的排序方法. 冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序

排序算法概述

提到排序算法我们要知道两个经常提到的概念:(1)排序算法的稳定性:所谓“稳定性”是 指,在待排序数组出现的两个相同的元素,排序之后相对维持保持不变.比如:待排序数组为arr[] = {1,4,3,1},排序之后元素变为arr_new[] = {1,1,4,3},并且arr_new中的第一个是arr中的第一个1,arr_new中的第二个1是arr中的第二个1,这是我们就说这种排序时稳定的.(2)原地排序:所谓原地排序是指,不申请多余的空间来辅助完成排序算法,而是在原来的待排序的数据之上直接进行比较

数据结构与算法系列十(排序算法概述)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

八大排序算法

转载:http://blog.csdn.net/hguisu/article/details/7776068 目录(?)[+] 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速

深入理解排序算法(一):初级排序算法

[本系列博文会对常见的排序算法进行分析与总结,并会在最后提供几道相关的一线互联网企业面试/笔试题来巩固所学及帮助我们查漏补缺.项目地址:https://github.com/absfree/Algo.由于个人水平有限,叙述中难免存在不清晰准确的地方,希望大家可以指正,谢谢大家:)] 一.概述 我们在日常开发中经常需要对一组数据对象进行排序,这里的数据对象不仅包括数字,还可能是字符串等抽象数据类型(Abstract Data Type).由于排序是很多其他操作(比如二分查找)能够高效进行的基础,因

数据结构与算法之——八大排序算法

附:关于这个主题,网上好的文章已经数不胜数,本篇是整合后的文章. 正文: 一.概述 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 本文所指八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 二.排序算法详述 1.

排序算法总结----比较类排序

概述:排序算法可分为比较性的排序,以及运算性的排序:这里详细介绍这些排序的原理,性能,实现,以及应用场合. 前面是维基百科的介绍,这里介绍几个比较典型的算法. 理论 计算复杂性理论 大O符号 全序关系 列表 稳定性 比较排序 自适应排序 排序网络 整数排序 交换排序 冒泡排序 鸡尾酒排序 奇偶排序 梳排序 侏儒排序 快速排序 臭皮匠排序 Bogo排序 选择排序 选择排序 堆排序 Smooth排序 笛卡尔树排序 锦标赛排序 循环排序 插入排序 插入排序 希尔排序 二叉查找树排序 图书馆排序 Pat

八大排序算法总结及C/C++实现

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1. 插入排序-直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

(转)详解八大排序算法

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到