传载自CSDN博客:你必须知道的十大经典排序算法汇总

0.排序算法种类和时间复杂度比较、


时间复杂度指的就是一个算法执行所耗费的时间
空间复杂度定义为该算法所耗费的存储空间

1.冒泡排序(Bubble Sort)

1.比较相邻的元素如果第一个比第二个大,就交换它们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
3.针对所有的元素重复以上的步骤,除了最后一个;
4.重复步骤1〜3,直到排序完成。

点击查看演示动图

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]) {       // 相邻元素两两对比var temp = arr[j+1];       // 元素交换arr[j+1] = arr[j];arr[j] = temp;}}}return arr;
}

2.快速排序(Quick Sort)

1.从数列中挑出一个元素,称为“基准”(pivot);
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置这个称为分区(分区)操作。
3.递归地(递归)把小于基准值元素的子数列和大于基准值元素的子数列排序。

点击查看动图演示

function quickSort(arr, left, right) {var len = arr.length,partitionIndex,left =typeof left !='number' ? 0 : left,right =typeof right !='number' ? len - 1 : right;if (left < right) {partitionIndex = partition(arr, left, right);quickSort(arr, left, partitionIndex-1);quickSort(arr, partitionIndex+1, right);}return arr;
}
function partition(arr, left ,right) {    // 分区操作var pivot = left,                     // 设定基准值(pivot)index = pivot + 1;for (var i = index; i <= right; i++) {if (arr[i] < arr[pivot]) {swap(arr, i, index);index++;}       }swap(arr, pivot, index - 1);return index-1;
}
function swap(arr, i, j) {var temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}

3.插入排序(Insertion Sort)

1.从第一个元素开始,该元素可以认为已经被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后;
6.重复步骤2〜5。

点击查看动图演示

function insertionSort(arr) {var len = arr.length;var preIndex, current;for (var i = 1; i < len; i++) {preIndex = i - 1;current = arr[i];while (preIndex >= 0 && arr[preIndex] > current) {arr[preIndex + 1] = arr[preIndex];preIndex--;}arr[preIndex + 1] = current;}return arr;
}

4.希尔排序(Shell Sort)

1.选择一个增量序列T1,T2,…,TK,其中TI> TJ,TK = 1;
2.按增量序列个数k,对序列进行k趟排序;
3.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
点击查看动图演示

5.选择排序(Selection Sort)

工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

点击查看动图演示

function selectionSort(arr) {var len = arr.length;var minIndex, temp;for (var i = 0; i < len - 1; i++) {minIndex = i;for (var j = i + 1; j < len; j++) {if (arr[j] < arr[minIndex]) {    // 寻找最小的数minIndex = j;                // 将最小数的索引保存}}temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}return arr;
}

6.堆排序(Heap Sort)

工作原理:利用堆这种数据结构所设计的一种排序算法堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
1.将初始待排序关键字序列(R1,R2 … .Rn)构建成大顶堆,此堆为初始的无序区;
2.将堆顶元素R [1]与最后一个元素 - [R [n]的交换,此时得到新的无序区(R1,R2,… Rn中-1)和新的有序区(RN),且满足ř并[1,2,…,N-1] <= R [N];
3.由于交换后新的堆顶R [1]可能违反堆的性质,因此需要对当前无序区(R1,R2,… Rn中-1)调整为新堆,然后再次将R [1]与无序区最后一个元素交换,得到新的无序区(R1,R2 … .Rn-2)和新的有序区(RN-1,RN)的。不断重复此过程直到有序区的元素个数为ñ -1,则整个排序过程完成。

点击查看动图演示

var len;   // 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量
function heapSort(arr) {buildMaxHeap(arr);for (var i = arr.length - 1; i > 0; i--) {swap(arr, 0, i);len--;heapify(arr, 0);}return arr;
}
function buildMaxHeap(arr) {  // 建立大顶堆len = arr.length;for (var i = Math.floor(len/2); i >= 0; i--) {heapify(arr, i);}
}function heapify(arr, i) {    // 堆调整var left = 2 * i + 1,right = 2 * i + 2,largest = i;if (left < len && arr[left] > arr[largest]) {largest = left;}if (right < len && arr[right] > arr[largest]) {largest = right;}if (largest != i) {swap(arr, i, largest);heapify(arr, largest);}
}function swap(arr, i, j) {var temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}

7.归并排序(Merge Sort)

1.把长度为Ñ的输入序列分成两个长度为N / 2的子序列;
2.对这两个子序列分别采用归并排序;
3.将两个排序好的子序列合并成一个最终的排序序列。

点击查看动图演示

function mergeSort(arr) { // 采用自上而下的递归方法var len = arr.length;if (len < 2) {return arr;}var middle = Math.floor(len / 2),left = arr.slice(0, middle),right = arr.slice(middle);return merge(mergeSort(left), mergeSort(right));
}function merge(left, right) {var result = [];while (left.length>0 && right.length>0) {if (left[0] <= right[0]) {result.push(left.shift());}else {result.push(right.shift());}}while (left.length)result.push(left.shift());while (right.length)result.push(right.shift());return result;
}

8.计数排序(Counting Sort)

1.找出待排序的数组中最大和最小的元素;
2.统计数组中每个值为我的元素出现的次数,存入数组Ç的第我项;
3.对所有的计数累加(从ç中的第一个元素开始,每一项和前一项相加);
4.反向填充目标数组:将每个元素我放在新数组的第C(ⅰ)项,每放一个元素就将C(ⅰ)减去1。

点击查看动图演示

function countingSort(arr, maxValue) {var bucket =new Array(maxValue + 1),sortedIndex = 0;arrLen = arr.length,bucketLen = maxValue + 1;for (var i = 0; i < arrLen; i++) {if (!bucket[arr[i]]) {bucket[arr[i]] = 0;}bucket[arr[i]]++;}for (var j = 0; j < bucketLen; j++) {while(bucket[j] > 0) {arr[sortedIndex++] = j;bucket[j]--;}}return arr;
}

9.桶排序(Bucket Sort)

1.设置一个定量的数组当作空桶;
2.遍历输入数据,并且把数据一个一个放到对应的桶里去;
3.对每个不是空的桶进行排序;
4.从不是空的桶里把排好序的数据拼接起来。

function bucketSort(arr, bucketSize) {if (arr.length === 0) {return arr;}var i;var minValue = arr[0];var maxValue = arr[0];for (i = 1; i < arr.length; i++) {if (arr[i] < minValue) {minValue = arr[i];               // 输入数据的最小值}else if (arr[i] > maxValue) {maxValue = arr[i];               // 输入数据的最大值}}// 桶的初始化var DEFAULT_BUCKET_SIZE = 5;           // 设置桶的默认数量为5bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;  var buckets =new Array(bucketCount);for (i = 0; i < buckets.length; i++) {buckets[i] = [];}// 利用映射函数将数据分配到各个桶中for (i = 0; i < arr.length; i++) {buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);}arr.length = 0;for (i = 0; i < buckets.length; i++) {insertionSort(buckets[i]);                     // 对每个桶进行排序,这里使用了插入排序for (var j = 0; j < buckets[i].length; j++) {arr.push(buckets[i][j]);                     }}return arr;
}

10.基数排序(Radix Sort)

1.取得数组中的最大数,并取得位数;
2.ARR为原始数组,从最低位开始取每个位组成基数数组;
3.对基数进行计数排序(利用计数排序适用于小范围数的特点);

点击查看动图演示

// LSD Radix Sort
var counter = [];
function radixSort(arr, maxDigit) {var mod = 10;var dev = 1;for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {for(var j = 0; j < arr.length; j++) {var bucket = parseInt((arr[j] % mod) / dev);if(counter[bucket]==null) {counter[bucket] = [];}counter[bucket].push(arr[j]);}var pos = 0;for(var j = 0; j < counter.length; j++) {var value =null;if(counter[j]!=null) {while ((value = counter[j].shift()) !=null) {arr[pos++] = value;}}}}return arr;
}

【排序】动画演示10大排序算法相关推荐

  1. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  2. 10大排序算法之二:冒泡排序【稳定的】,但复杂度高,一般不用冒泡排序的

    10大排序算法之二:冒泡排序[稳定的],但复杂度高,一般不用冒泡排序的 提示:整个算法界,一共有十大排序算法,每一个算法都要熟悉,才算是算法入门 算法界的十大排序算法分别是: 选择排序.冒泡排序.插入 ...

  3. matlab中gad,10大经典算法matlab代码以及代码详解【数学建模、信号处理】

    [实例简介] 10大算法程序以及详细解释,包括模拟退火,禁忌搜索,遗传算法,神经网络.搜索算法. 图论. 遗传退火法.组合算法.免疫算法. 蒙特卡洛.灰色预测.动态规划等常用经典算法.是数学建模.信号 ...

  4. 数据结构与算法--经典10大排序算法(动图演示)【建议收藏】

    十大经典排序算法总结(动图演示) 算法分类 十大常见排序算法可分为两大类: 比较排序算法:通过比较来决定元素的位置,由于时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序 非比较类型排 ...

  5. 面试中的 10 大排序算法总结

    前言 查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中.因为其实现代码较短,应用较常见.所以在面试中经常会问到排序算法及其相关的问题.但万变不离其宗,只要熟悉了思想,灵活运用也不是难事. ...

  6. 9个元素换6次达到排序序列_程序员必须掌握的:10大排序算法梳理已整理好

    从数组中选择最小元素,将它与数组的第一个元素交换位置.再从数组剩下的元素中选择出最小的元素,将它与数组的第二个元素交换位置.不断进行这样的操作,直到将整个数组排序. 动态过程 算法原理参考:图解选择排 ...

  7. JAVA十大排序算法动画_十大排序算法(java实现)

    [前言]最近在重新研究算法,此篇博文供自己复习使用也为方便广大程序员同学!此文代码均为自己实现,通过对比经典解法校验,若有错请读者及时提出! - [对比分析图]首先,我们先来对比分析一下这十大排序算法 ...

  8. 10大机器学习算法速览,带你开启AI之旅

    原文作者:Sunil Ray 译者:TalkingData 张永超 简介 从广义上讲,机器学习算法有三种类型: 监督学习 该算法是由一个目标/结果变量(也成为因变量)组成,该变量可以从一组给定的预测变 ...

  9. 10 大编程算法帮助程序员踏上“高手”层次,了解一下,你绝对不亏!

    1.快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明 ...

  10. 机器学习10大经典算法详解

    "数据+算法=模型". 面对具体的问题,选择切合问题的模型进行求解十分重要.有经验的数据科学家根据日常算法的积累,往往能在最短时间内选择更适合该问题的算法,因此构建的模型往往更准确 ...

最新文章

  1. 8天学通MongoDB——第四天 索引操作
  2. 一网打尽,最全面的跨域解决方案来了!
  3. Qt Creator连接QNX设备
  4. ubuntu 16.04 安装Caffe GPU版本
  5. LeetCode 2187. 完成旅途的最少时间(二分查找)
  6. Windows系统安全从定制IP策略开始
  7. 【kafka】Kafka 之 Group 状态变化分析及 Rebalance 过程
  8. 2019杭电多校第九场 Rikka with Cake (hdu6681)
  9. scale data:线性空间映射
  10. 机器学习面试- Scikit-learn
  11. 微服务学习之Consul服务注册与发现【Hoxton.SR1版】
  12. 安装 | MATLAB2020a (64位) 安装教程及安装包下载链接
  13. 华为静态路由配置案例
  14. IOTQQ(OPQbot)—QQ机器人、部署在linux上(一步步实
  15. 路由器原理和路由协议介绍
  16. 电脑有网但是浏览器无法显示网页
  17. 3D房地产营销PPT模板
  18. 坐标系旋转后的点坐标、坐标点旋转后的点坐标
  19. CODING 敏捷实战系列加餐课:CODING 做敏捷这一年 - 理解一站式 DevOps 产品思想
  20. Exception————c3p0

热门文章

  1. 文件和目录属性ls which alias
  2. shell脚本备份数据库
  3. 声音就是你的武器!这样的攻防大赛你一定没有见过!
  4. 如何查看mysql 的端口号?
  5. 2007.05.07 不再如此堕落
  6. Centos7.4 安装Docker CE版
  7. 关于vue自定义事件中,传递参数的一点理解
  8. 【树莓派】在树莓派上制作开机自启动程序及服务2
  9. owasp testing guide 2014 中文
  10. android动画 底部弹窗 效果