典型排序算法比较

根据带排序数据是否全部放入内存,排序分为内排序和外排序。

下面就根据我看书的体会,主要分析内排序的性能。

内排序的种类:插入排序(直接插入排序,希尔排序),选择排序(简单选择排序、堆排序),交换排序(冒泡排序、快速排序),归并排序。

其中用的比较多的是插入排序、归并排序、快速排序。

排序算法的比较:性能的比较可以从以下5个方面进行分析:时间复杂度(平均情况、最好情况、最差情况),空间复杂度(辅助空间),稳定性。

平均情况角度,三种改进算法胜过希尔排序,并且远好于三种简单算法。

最好情况角度,冒泡和直接插入排序更胜一筹,就是说,在待排序数据基本有序的情况下,反而不应该使用四种复杂算法。

最坏情况角度,堆排序和归并排序要更胜一筹。

空间复杂度角度,归并排序强调要想跑的快,必须给足够的空间;快速排序也有相应的空间复杂度的要求;相比之下,堆排序空间复杂度职位O(1),少量索取,大量付出型。因此,在算法执行环境非常在乎内存使用量的情况下,选择堆排序是个不错的选择,归并排序和快速排序就不是最佳选择了。

稳定性角度,归并排序独占鳌头。对算法稳定性要求很高的情况下,归并排序是不二选择。

待排序记录的个数角度,记录数越小,越应该选择简单排序。例如,在对快速排序进行优化的时候,其中就有一个方面就是在记录数小于一定阀值的情况下,应该使用插入排序。

移动次数角度,简单选择排序优势就很大。

时间: 2024-11-09 18:37:51

典型排序算法比较的相关文章

算法(第4版)-2.1 初级排序算法

2.1.1 游戏规则 1. 排序成本模型:在研究排序算法时,我们需要计算比较和交换的数量.对于不交换元素的算法,我们会计算访问数组的次数. 2. · 原地排序算法:除了函数调用所需的栈和固定数目的实例变量之外无需额外内存的原地排序算法: · 其他排序算法:需要额外内存空间来储存另一份数组副本. 2.2.2 选择排序 public class Selection { public static void sort(Comparable[] a) { // 将a[]按升序排列 int N = a.l

8大排序算法图文讲解

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 本文将依次介绍上述八大排序算法. 算法一:插入排序 插入排序示意图 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 1)将第一待排序序列第一

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

常用排序算法

本篇给大家介绍几种软件工程中常用的排序算法 1. 插入排序 插入排序的基本思想就是:每次将一个待排序的记录,按其关键字大小插入到前面已经排序好的序列中,直到全部记录插入完成为止. 对于插入排序的概念以及其原理大家可以参考<排序算法的学习之路——插入排序(概念篇)> 插入排序细分可以分成三种情况. 直接插入排序——<排序算法学习之路——直接插入排序> 折半插入排序——<排序算法学习之路——折半插入排序> 表插入排序 ——<排序算法学习之路——表插入排序> 2.

排序算法的基本思想和OC代码实现

算法的基本思想和OC代码实现 一 .冒泡排序   (平均时间复杂度 o(N*N))  基本思想:两个数比较大小,较大的数下沉,较小的数冒起来. 过程:比较相邻的两个数据,如果第二个数小,就交换位置 从后向前两两比较,一直到比较最前两个数据.最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了. 继续重复上述过程,依次将第2,3,….,n-1个最小数排好位置. int arr[5]={23,21,45,23,64}; int temp; for (int i=0; i<4; i++) {

七大排序算法

排序算法效率比较 各种排序算法的比较 冒泡排序 基本定义 两两比较相邻记录的的关键字,如果反序则交换,直到没有反序的记录为止. 时间复杂度分析 最好的情况是,数组是有序的,只需要n - 1次的比较,时间复杂度是O(n) 最坏的情况是,数组是逆序的,需要比较 ∑i=2n(i?1)=1+2+3+...+(n?1)=n(n?1)2 , 所以时间复杂度为O(n2) 代码实现 void Bubble_sort(int arr[], int len) { bool flag = true; for(int

各种排序算法python和java实现(二)

第一篇博客实现了三种最基本最简单的排序算法,本篇文章将在这三种算法的基础上稍微演变一下. 1.快排 光从名字看就知道速度肯定不差,前一篇讲的冒泡排序,怎么看都不算是一种好的排序算法,里面充斥了太多的无谓的交换动作,时间复杂度倒是很稳定o(n^2),但对于排序算法实在说不过去.快排是冒泡排序的改进版,思路就是分治,将一个序列随机按照某个值分成两个子序列,子序列A里面的值全部比该值大,另一个子序列B的值全部比该值小,这听起来像是二叉排序树.然后依次对子序列进行如上操作,很明显快排最简单的实现就是用递

排序算法——归并排序

归并排序是分治法的典型举例. 分治法的思想是,将原有问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解. 分治模式在每层递归时都有三个步骤: 分解原问题为若干子问题,这些子问题是原问题的规模较小的实例. 解决这些子问题,递归地求解各子问题.然而,若子问题的规模足够小,则直接求解. 合并这些子问题的解成原问题的解. 归并排序算法完全遵循分治模式.直观上其操作如下: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列. 解决:使用

js十大排序算法详解

十大经典算法导图  图片名词解释:n: 数据规模k:"桶"的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外内存 1.冒泡排序 1.1  原始人冒泡排序 function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1]