排序

250 阅读2分钟
// 不稳定的排序: 选择排序、快速排序、希尔排序、堆排序
// 稳定排序:冒泡排序、插入排序、归并排序、基数排序
function 冒泡排序(arr){
    let len = arr.length;
    for (let i = 0; i <len; i++) {
        for (let 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
}//最好情况:O(n)  最坏情况O(n^2)  平均情况O(n^2)
function 快速排序(arr){
    //如果数组<=1,则直接返回
    if(arr.length<=1){return arr;}
    var pivotIndex=Math.floor(arr.length/2);
    //找基准,并把基准从原数组删除
    var pivot=arr.splice(pivotIndex,1)[0];
    //定义左右数组
    var left=[];
    var right=[];

    //比基准小的放在left,比基准大的放在right
    for(var i=0;i<arr.length;i++){
        if(arr[i]<=pivot){
            left.push(arr[i]);
        }
        else{
            right.push(arr[i]);
        }
    }
    //递归
    return 快速排序(left).concat([pivot],快速排序(right));
}//最好情况:O(nlogn的对数)  最坏情况O(n^2)  平均情况O(nlogn的对数)
function 插入排序(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;
}//最好情况:O(n)  最坏情况O(n^2)  平均情况O(n^2)
function 希尔排序(arr) {
    var len = arr.length,
        temp,
        gap = 1;
    while(gap < len/3) {          //动态定义间隔序列
        gap =gap*3+1;
    }
    for (gap; gap> 0; gap = Math.floor(gap/3)) {
        for (var i = gap; i < len; i++) {
            temp = arr[i];
            for (var j = i-gap; j > 0 && arr[j]> temp; j-=gap) {
                arr[j+gap] = arr[j];
            }
            arr[j+gap] = temp;
        }
    }
    return arr;
}//最好情况:O(n)  最坏情况O(n^2)  平均情况O(n^1.3)
function 选择排序(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;
}//最好情况:O(n^2)  最坏情况O(n^2)  平均情况O(n^2)

function 归并排序(){
    function mergeSort(arr){
        // 设置终止的条件,
        if (arr.length < 2) {
          return arr;
        }
        //设立中间值
        var middle = parseInt(arr.length / 2);
        //第1个和middle个之间为左子列
        var left = arr.slice(0, middle);
        //第middle+1到最后为右子列
        var right = arr.slice(middle);
        if(left=="undefined"&&right=="undefined"){
           return false;
        }
        return merge(mergeSort(left), mergeSort(right));
      }
      
      function merge(left, right){
        var result = [];
      
        while (left.length && right.length) {
          if(left[0] <= right[0]){
            //把left的左子树推出一个,然后push进result数组里
             result.push(left.shift());
          }else{
            //把right的右子树推出一个,然后push进result数组里
           result.push(right.shift());
          }
        }
        //经过上面一次循环,只能左子列或右子列一个不为空,或者都为空
        while (left.length){
          result.push(left.shift());
        } 
        while (right.length){
          result.push(right.shift());
        }
        return result;
      }
      // 测试数据
      var nums=[6,10,1,9,4,8,2,7,3,5];
      mergeSort(nums);
}//时间复杂度O(nlogn的对数)