为了方便测试,这里写了一个创建长度为n的随机数组

  1. function createArr(n) {
  2. var arr = [];
  3. while (n--) {
  4. arr.push(~~(Math.random() * 100));
  5. }
  6. return arr;
  7. }
冒泡排序:在要排序的一组数中,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
若排序要求为从小到大,每一次外层循环把最大的数沉在最后一位,内层循环比较数从序列末位减一位。
注意一点,当要排序 N 个数,已经经过 N-1 次遍历后,已经是有序数列

  1. function bubbleSort(arr){
  2. var len = arr.length,
  3. i,
  4. j;
  5. for(i = 0; i < len - 1; i++){
  6. for(j = 0; j < len - 1 - i; j++){
  7. if(a[j] > a[j+1]){
  8. a[j+1] = [a[j], a[j] = a[j+1]][0];
  9. }
  10. }
  11. }
  12. return arr;
  13. }
选择排序:每一次外层循环从待排序的数中选出最小(或最大)的一个元素,存放在序列的起始位置,内层循环比较数从序列首位减一位 ,直到全部待排序的数据元素排完。

  1. function selectSort(arr) {
  2. var len = arr.length,
  3. i,
  4. j,
  5. min;
  6. for(i = 0 ; i < len - 1; i++){
  7. min = i;
  8. for(j = i + 1; j < len ; j++){
  9. if(arr[j] < arr[min]){
  10. min = j;
  11. }
  12. }
  13. if(min != i){
  14. arr[min] ^= arr[i];
  15. arr[i] ^= arr[min];
  16. arr[min] ^= arr[i];
  17. }
  18. }
  19. return arr;
  20. }
快速排序: 在排序效率在同为O(N*logN)的几种排序方法中效率较高,基本思想是:快速排序采用的思想是分治思想。快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。左右两边递归快速排序。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
第一种实现方法:

  1. function quickSort(arr){
  2. if( (arr.length) > 1){
  3. var key = arr[0],
  4. len = arr.length,
  5. leftArr = [],
  6. rightArr = [];
  7. for(var i = 1; i < len; i++){
  8. if(arr[i] <= key){
  9. leftArr.push(arr[i]);
  10. }else {
  11. rightArr.push(arr[i]);
  12. }
  13. }
  14. leftArr = quickSort(leftArr);
  15. rightArr = quickSort(rightArr);
  16. return leftArr.concat(key,rightArr);
  17. }else{
  18. return arr;
  19. }
  20. }

第二种实现方法:

  1. function quickSort(array) {
  2. function sort(prev, numsize) {
  3. var nonius = prev;
  4. var j = numsize - 1;
  5. var flag = array[prev];
  6. if ((numsize - prev) > 1) {
  7. while (nonius < j) {
  8. for (; nonius < j; j--) {
  9. if (array[j] < flag) {
  10. array[nonius++] = array[j]; //a[i] = a[j]; i += 1;
  11. break;
  12. }
  13. ;
  14. }
  15. for (; nonius < j; nonius++) {
  16. if (array[nonius] > flag) {
  17. array[j--] = array[nonius];
  18. break;
  19. }
  20. }
  21. }
  22. array[nonius] = flag;
  23. sort(0, nonius);
  24. sort(nonius + 1, numsize);
  25. }
  26. }
  27.  
  28. sort(0, array.length);
  29. return array;
  30. }
插入排序: 每步将一个待排序的元素,按其排序码大小,插入到前面已经排好序的一组元素的适当位置上,直到全部插入为止。

  1. function insertSort(arr){
  2. for(var i=1; i<arr.length; i++){
  3. var tmp = arr[i];
  4. var key = i - 1;
  5. while(key>=0&&tmp<arr[key]){
  6. arr[key+1] = arr[key]
  7. key--;
  8. }
  9. if(key+1 != i){
  10. arr[key+1] = tmp
  11. }
  12. }
  13. return arr;
  14. }

js实现四大经典排序算法的更多相关文章

  1. PHP 中四大经典排序算法

    1.冒泡排序 在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. ...

  2. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  3. 经典排序算法总结与实现 ---python

    原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用P ...

  4. 经典排序算法及python实现

    今天我们来谈谈几种经典排序算法,然后用python来实现,最后通过数据来比较几个算法时间 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据 ...

  5. 经典排序算法 - 基数排序Radix sort

    经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...

  6. 经典排序算法 - 高速排序Quick sort

    经典排序算法 - 高速排序Quick sort 原理,通过一趟扫描将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整 ...

  7. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  8. C# 经典排序算法大全

    C# 经典排序算法大全 选择排序 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  9. Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

    2017年4月29日~5月1日,国际劳动节, 三天的小长假. 在国内,小长假往往是这样的: 然而我当时在戏称为"德村"(德国农村)的Walldorf出差并且住在Wiesloch, ...

随机推荐

  1. 告别被拒,如何提升iOS审核通过率(上篇)

    iOS审核一直是每款移动产品上架苹果商店时面对的一座大山,每次提审都像是一次漫长而又悲壮的旅行,经常被苹果拒之门外,无比煎熬.那么问题来了,我们有没有什么办法准确把握苹果审核准则,从而提升审核的通过率 ...

  2. vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client

    vmware里面的名词 vSphere.vCenter Server.ESXI.vSphere Client vSphere.vCenter Server.ESXI.vSphere Client VS ...

  3. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  4. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  5. Go web开发初探

    2017年的第一篇博客,也是第一次写博客,写的不好,请各位见谅. 本人之前一直学习java.java web,最近开始学习Go语言,所以也想了解一下Go语言中web的开发方式以及运行机制. 在< ...

  6. 去IOE的一点反对意见以及其他

    某天在机场听见两老板在聊天,说到他们目前销售的报表老跟不上的问题,说要请一个人,专门合并和分析一些发过来的excel表格,我真想冲上去说,老板,你需要的是一个信息处理的系统,你需要咨询么.回来一直耿耿 ...

  7. win7下利用ftp实现华为路由器的上传和下载

    win7下利用ftp实现华为路由器的上传和下载 1.  Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...

  8. Xcode 锁终端

    锁终端 输入: <1>cd /Applications/Xcode.app 回车 结果显示: Xcode.app 输入: <2>sudo chown -hR root:whee ...

  9. 使用git进行源代码管理

    git是一款非常流行的分布式版本控制系统,使用Local Repository追踪代码的修改,通过Push和Pull操作,将代码changes提交到Remote Repository,或从Remote ...

  10. Ajax.BeginForm方法 参数

    感谢博主 http://www.cnblogs.com/zzgblog/p/5454019.html toyoung 在Asp.Net的MVC中的语法,在Razor页面中使用,替代JQuery的Aja ...