首页 > 编程语言 > 详细

JavaScript实现各种排序算法

时间:2017-02-25 00:00:49      阅读:307      评论:0      收藏:0      [点我收藏+]

 

前言:本文主要是用JavaScript实现数据结构中的各种排序算法,例如:插入排序
、希尔排序、合并排序等。

 

冒泡排序


 

function bubbleSort(arr) {
       console.time("冒泡排序")var num = 0;
            for (var i = arr.length; i > num; num++) {
                for (var j = i - 1; j > num; j--) {
                    if(arr[j-1]>arr[j]){
                    var temp = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j] = temp;
                  }
                }
            }
        console.timeEnd("冒泡排序")
        return arr
   }
   var arr = [12, 290, 219, 278, 4432,21, 43, 89, 78];
   console.log( bubbleSort(arr));

 技术分享

时间复杂度: 最差 O(n2) ; 最优 O(n)

 

插入排序


 插入排序的基本原理如下图:从前向后构建有序序列,对于未排序序列,在已排序的序列中从后向前扫描插入位置,对于第p个元素,需要扫描p-1次,平均来说插入排序算法复杂度为O(n2)

技术分享

function insertSort(arr) {
    console.time("插入排序")

    var len = arr.length;

    if (len <= 1) {
        return arr;
    }

    // 1~n-1趟排序
    arr.map(function(item,index){
      if(index>0){
        for (var j = index; j > 0 && arr[j - 1] > item; j--) {
            arr[j] = arr[j - 1];
        }
        arr[j] = item;
      }
  });
    console.timeEnd("插入排序")
    return arr
}
var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78];
console.log(insertSort(arr));

技术分享

 

 

希尔排序


 shell排序也称为递减增量排序,效果比插入排序更好,对于不同的增量,排序性能也不同

技术分享

下面我们看看 步长选择为技术分享并且对步长取半直到步长达到1的算法实现。

function shellSort(arr) {
    console.time("希尔排序")
    var gap, i, j;
    var temp;
    for (gap = arr.length >> 1; gap > 0; gap >>= 1)
        for (i = gap; i < arr.length; i++) {
            temp = arr[i];
            for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
                arr[j + gap] = arr[j];
            arr[j + gap] = temp;
        }
    console.timeEnd("希尔排序")
    return arr
}
var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78];
console.log(shellSort(arr));

技术分享

算法实现过程如下:这里我们选择 步长为4:(每一列相当于一次插入排序

12        190  219  278
4432    21    43    89
78
// 第一次排序之后得到:
12      21     43      89
78      190   219    278
4432

// 连接起来得到的是 [12,21,43,89,78,190,219,278,4432],接着以2为步长 排序之后变为:
12    21
43    89
78    190
219  278
4432

// 然后就是简单的插入排序

平均时间复杂度为: 技术分享

 

快速排序


快速排序的关键在于选取中心枢纽povit,该值可以随机选择,但是不同的选择会有所影响,在这里我直接选择了最左端的元素

function quickSort(arr) {
  return qSort(0,arr.length-1,arr);
}
function qSort(low, high, x) {
    //快速排序
    if (low < high) {
        var povit = partition(low, high, x);

        if (low < povit) qSort(low, povit - 1, x);
        if (povit < high) qSort(povit + 1, high, x)
    }
    return x
}

function partition(low, high, x) {

    if (low == high) return;

    var povit = low;
    var temp = x[povit];
    while (low < high) {
        while (low < high && x[high] < temp) {
            high--;
        }
        if (low != high) {
            x[povit] = x[high];
            povit = high;
            x[povit] = temp;
            low++;
        }
        while (low < high && x[low] > temp) {
            low++;
        }
        if (low != high) {
            x[povit] = x[low];
            povit = low;
            x[povit] = temp;
            high--;
        }
    }

    return povit;
}
var arr = [12, 290, 219, 278, 4432, 21, 43, 89, 78];
console.time("快速排序");
console.log(quickSort(arr));
console.timeEnd("快速排序");

技术分享

 

结束语

  今天暂时先总结这四种排序算法,有时间再把其他的补上

JavaScript实现各种排序算法

原文:http://www.cnblogs.com/kasmine/p/6416472.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!