常用的排序算法都有哪些?
排序另一种分法
外排序:需要在内外存之间多次交换数据才能进行
内排序:
归并排序
冒泡排序
快速排序
简单选择排序
堆排序
直接插入排序
希尔排序
插入类排序
选择类排序
交换类排序
归并类排序
常用的排序算法有:冒泡排序、选择排序、堆排序、SHELL排序、快速排序、归并排序、磁盘排序等等。但是每种排序算法都是各有优缺点。如果需要进一步研究各种算法的性能的话,那么就必须学习计算机算法和复杂性这门课程。
排序算法 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。分类
在计算机科学所使用的排序算法通常被分类为:
计算的复杂度(最差、平均、和最好表现),依据串列(list)的大小(n)。一般而言,好的表现是O。(n log n),且坏的行为是Ω(n2)。对於一个排序理想的表现是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要Ω(n log n)。
记忆体使用量(以及其他电脑资源的使用)
稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的串列中R出现在S之前,在排序过的串列中R也将会是在S之前。
一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序(bubble sort)和快速排序(quicksort)。选择排序包含shaker排序和堆排序(heapsort)。
当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。
(4, 1) (3, 1) (3, 7) (5, 6)
在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:
(3, 1) (3, 7) (4, 1) (5, 6) (维持次序)
(3, 7) (3, 1) (4, 1) (5, 6) (次序被改变)
不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地时作为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个物件间之比较,就会被决定使用在原先资料次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。
排列算法列表
在这个表格中,n是要被排序的纪录数量以及k是不同键值的数量。
稳定的
冒泡排序(bubble sort) — O(n2)
鸡尾酒排序 (Cocktail sort, 双向的冒泡排序) — O(n2)
插入排序 (insertion sort)— O(n2)
桶排序 (bucket sort)— O(n); 需要 O(k) 额外 记忆体
计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外 记忆体
归并排序 (merge sort)— O(n log n); 需要 O(n) 额外记忆体
原地归并排序 — O(n2)
二叉树排序 (Binary tree sort) — O(n log n); 需要 O(n) 额外记忆体
鸽巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 额外记忆体
基数排序 (radix sort)— O(n·k); 需要 O(n) 额外记忆体
Gnome sort — O(n2)
Library sort — O(n log n) with high probability, 需要 (1+ε)n 额外记忆体
不稳定
选择排序 (selection sort)— O(n2)
希尔排序 (shell sort)— O(n log n) 如果使用最佳的现在版本
Comb sort — O(n log n)
堆排序 (heapsort)— O(n log n)
Smoothsort — O(n log n)
快速排序 (quicksort)— O(n log n) 期望时间, O(n2) 最坏情况; 对於大的、乱数串列一般相信是最快的已知排序
Introsort — O(n log n)
Patience sorting — O(n log n + k) 最外情况时间, 需要 额外的 O(n + k) 空间, 也需要找到最长的递增子序列(longest increasing subsequence)
不实用的排序算法
Bogo排序 — O(n × n!) 期望时间, 无穷的最坏情况。
Stupid sort — O(n3); 递回版本需要 O(n2) 额外记忆体
Bead sort — O(n) or O(√n), 但需要特别的硬体
Pancake sorting — O(n), 但需要特别的硬体
排序的算法
排序的算法有很多,对空间的要求及其时间效率也不尽相同。下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围内的排序算法。
插入排序
冒泡排序
选择排序
快速排序
堆排序
归并排序
基数排序
希尔排序
插入排序
插入排序是这样实现的:
首先新建一个空列表,用于保存已排序的有序数列(我们称之为"有序列表")。
从原数列中取出一个数,将其插入"有序列表"中,使其仍旧保持有序状态。
重复2号步骤,直至原数列为空。
插入排序的平均时间复杂度为平方级的,效率不高,但是容易实现。它借助了"逐步扩大成果"的思想,使有序列表的长度逐渐增加,直至其长度等于原列表的长度。
冒泡排序
冒泡排序是这样实现的:
首先将所有待排序的数字放入工作列表中。
从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
重复2号步骤,直至再也不能交换。
冒泡排序的平均时间复杂度与插入排序相同,也是平方级的,但也是非常容易实现的算法。
选择排序
选择排序是这样实现的:
设数组内存放了n个待排数字,数组下标从1开始,到n结束。
i=1
从数组的第i个元素开始到第n个元素,寻找最小的元素。
将上一步找到的最小元素和第i位元素交换。
如果i=n-1算法结束,否则回到第3步
选择排序的平均时间复杂度也是O(n²)的。
快速排序
现在开始,我们要接触高效排序算法了。实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。这是一种先进的思想,也是它高效的原因。因为在排序算法中,算法的高效与否与列表中数字间的比较次数有直接的关系,而"保证列表的前半部分都小于后半部分"就使得前半部分的任何一个数从此以后都不再跟后半部分的数进行比较了,大大减少了数字间不必要的比较。但查找数据得另当别论了。
堆排序
堆排序与前面的算法都不同,它是这样的:
首先新建一个空列表,作用与插入排序中的"有序列表"相同。
找到数列中最大的数字,将其加在"有序列表"的末尾,并将其从原数列中删除。
重复2号步骤,直至原数列为空。
堆排序的平均时间复杂度为nlogn,效率高(因为有堆这种数据结构以及它奇妙的特征,使得"找到数列中最大的数字"这样的操作只需要O(1)的时间复杂度,维护需要logn的时间复杂度),但是实现相对复杂(可以说是这里7种算法中比较难实现的)。
看起来似乎堆排序与插入排序有些相像,但他们其实是本质不同的算法。至少,他们的时间复杂度差了一个数量级,一个是平方级的,一个是对数级的。
平均时间复杂度
插入排序 O(n2)
冒泡排序 O(n2)
选择排序 O(n2)
快速排序 O(n log n)
堆排序 O(n log n)
归并排序 O(n log n)
基数排序 O(n)
希尔排序 O(n1.25)
冒泡排序
654
比如说这个,我想让它从小到大排序,怎么做呢?
第一步:6跟5比,发现比它大,则交换。564
第二步:5跟4比,发现比它大,则交换。465
第三步:6跟5比,发现比它大,则交换。456
其实记太多也没用
就记住O(N^2)的选排(别看跟冒泡一样的复杂度,但选排交换次数比冒泡少,若交换代价很大的话,选排会比冒泡快很多),插排(主要是要求相同权值的项按输入顺序排列时,但本人认为用快排排字典序更好)
O(nlogn)的快排(最常用),堆排(主要是记堆),归排(除了求逆序对基本没啥用)
O(N)的桶排
就可以了,其他的根本没啥用。啥子希尔排序这些别看是传说中最优,但又难理解又难写,还考直觉,比快排还快不了多少,所以没啥实用价值。
常用的就插入、选择、交换、归并和基数排序几类。
排序有哪些方法
一、冒泡排序 这是一种简单的排序算法。它重复地遍历待排序的列表,比较每对相邻的项,如果它们的顺序错误就把它们交换过来。这个过程会对每一对相邻项都进行,从开始第一对到最后的最后一对,这样在最后的列表中,最大的数会经过交换被放到最后的位置。二、选择排序 选择排序也是一种简单直观的排序算...
常见的排序算法有
常见的排序算法有很多种,包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。首先,我们来了解一下冒泡排序。冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。这个过程会重复进行,直到整个数列变成有序状态。例如,对于数列...
常见的排序算法有哪些
冒泡排序是排序算法中较为简单的一种,英文称为Bubble Sort。它遍历所有的数据,每次对相邻元素进行两两比较,如果顺序和预先规定的顺序不一致,则进行位置交换;这样一次遍历会将最大或最小的数据上浮到顶端,之后再重复同样的操作,直到所有的数据有序。二、选择排序 选择排序简单直观,英文称为Selection ...
排序算法有几种方式?
排序的依据是算法,有快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择。其中,插入排序主要包括直接插入排序和希尔排序两种;选择排序主要包...
有什么好用的排序算法?
程序员实用算法有用推荐 算法一: 快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要O(nlog n)次比较。在最坏状况下则需要O(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(n log n) 算法更快,因为它的内部循环 (inner loop)可以在...
几种常见的排序算法
常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:点击以下图片查看大图:关于时间复杂度平方阶(O(n2))排序各类简单排序:直接插入、直接选择和冒泡排序。线性对数阶(O(nlog2n))排序快速排序、堆排序和归并排序;O(n1+§))排序...
有哪些排序算法可以稳定的排序?
1、冒泡排序:冒泡排序是一种基本的比较排序算法,它通过多次遍历数据来将较大的元素逐渐“冒泡”到数组的末尾。冒泡排序是稳定的,但在大型数据集上性能较差。2、插入排序:插入排序是一种简单的排序算法,它逐个将元素插入已排序的部分。插入排序是稳定的,适用于小型数据集。3、归并排序:归并排序采用...
...排序方法有哪些?比较一下冒泡排序和选择排序算法上的异同。_百度知...
1、都是比较排序:冒泡排序和选择排序都是通过比较相邻元素的大小,然后交换位置来实现排序的,因此它们都属于比较排序算法。2、都需要进行多次遍历:无论是冒泡排序还是选择排序,都需要多次遍历待排序的序列,才能实现排序。不同之处:1、操作方式不同:冒泡排序是依次比较相邻元素的大小,如果顺序错误就...
排序方法有哪几种 排序方法的相关知识
1、排序方法有10种,分别是:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。2、冒泡排序算法是把较小的元素往前调或者把较大的元素往后调。这种方法主要是通过对相邻两个元素进行大小的比较,根据比较结果和算法规则对该二元素的位置进行交换,这样逐个...
常用的排序算法都有哪些
直接插入排序、链表插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、归并排序、二叉树排序、基数排序等。插入排序、冒泡排序、二叉树排序、二路归并排序及其他线形排序是稳定的, 选择排序、希尔排序、快速排序、堆排序是不稳定的。插入、冒泡排序的速度较慢,但参加排序的序列局部或...
诺转尧强: 常用的排序算法有:冒泡排序、选择排序、堆排序、SHELL排序、快速排序、归并排序、磁盘排序等等.但是每种排序算法都是各有优缺点.如果需要进一步研究各种算法的性能的话,那么就必须学习计算机算法和复杂性这门课程.
安平县14798446858: 常见的排序方法有哪些 - ?
诺转尧强: 常见的有冒泡排序,选择排序(这两个复杂度是一样的,都是O(n^2)),希尔排序是目前效率最高的(复杂度为O(nlgn)),另外还有插入排序(希尔排序就是在此基础上改进的),快速排序,归并排序,基数排序等
安平县14798446858: 几种常见简单排序算法 - ?
诺转尧强: 排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择排序和堆排序)、归并排序(二路归并排序和多路归并排序);(2)线性时间非比较类排序:计数排序、基数排序和桶排序.
安平县14798446858: 排序方法有哪些 - ?
诺转尧强: 快速排序,冒泡排序、直接排序,简单选择排序,快速排序,希尔排序,堆排序
安平县14798446858: 数据结构中排序方法有多少种?
诺转尧强: 排序有5种; 1、插入排序(直接插入排序和希尔排序) 2、选择排序(直接选择排序和堆排序) 3、交换排序(冒泡排序和快速排序) 4、归并排序 5、基数排序 直接插入排序:逐个将后一个数加到前面的排好的序中.在直接插入排序过程中,...
安平县14798446858: 数据结构排序算法有哪些常用的 - ?
诺转尧强: 最常用的是快速排序,基数排序,计数排序,归并排序,堆排序,(偶尔还有插入排序) 都有各自的应用,快排就是单纯的快,但是特殊数据下复杂度会退化 基数排序可以配合一些特定的算法,譬如后缀数组的构建 计数排序简单且常用,通常排序值域小但是数据量大的情况 归并直接用来排序并不多,但是可以用来求解一些其他问题,本身的思想也非常重要,有很多拓展的算法(不是排序算法) 堆排序胜在稳定,不论数据如何最坏都是O(nlogn),一般情况比快速排序慢些,但是极端情况下表现十分优秀,常用来配合快速排序,优化其稳定性 插入排序适合极少量数据的排序(几个到十几个),速度要比这些高级算法快一些
安平县14798446858: 有哪些常见排序算法呢? ?
诺转尧强: 中文名排序性质计算机内经常进行的一种操作排序算法快速排序、希尔排序、堆排序等分类稳定排序等1概念描述分类2冒泡排序3选择排序优劣Java代码4插入排序优劣Java代码原理C程序原理Pascal程序Pascal程序9树型排序▪Pascal程序10面试题排序概念描述编辑将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序 以上是对这个问题的回答,希望对您有帮助.
安平县14798446858: 常见排序算法? - ?
诺转尧强: #include "stdio.h" #include "conio.h" #define MAXSIZE 20 #define LT(a,b) ((a)<(b)) typedef int KeyType; typedef int InfoType; typedef struct{KeyType key;InfoType otherinfo; }RedType; typedef struct{RedType r[MAXSIZE+1];int length; }...
安平县14798446858: 排序法都有哪些? - ?
诺转尧强: 排序法可分为简单排序法和交替排序法.简单排序法1. 简单排序法也称序列评定法,是指管理者把本部门的所有员工从绩效最高者到绩效最低者(或从最好者到最差者)进行排序,即对一批考核对象按照一定标准排出“1、2、3、4……”的...
安平县14798446858: 几种常见的排序算法 - ?
诺转尧强: for(i = 0; i < n; i++) for(j = 0; j < n - 1 - i; j++){if(arr[j] arr[j + 1]){arr[j] = arr[j] ^ arr[j+1]; arr[j+1] = arr[j] ^ arr[j+1]; arr[j] = arr[j] ^ arr[j+1];}}} 交换两个数据,可以用用临时变量,也可用以下的两个方法a = a^b;b = a^b;a = a^b;或者 a = a + b;b = a - b;a = a - ...