JavaScript实现常用排序算法

186 阅读3分钟

数组的随机排序

var arr = [1,2,3,4,5,6,7,8,9,10];
  	arr.sort(function(){
  		return Math.random() - 0.5;
  	})
  	console.log(arr);

sort() 默认情况下根据字符编码进行排序。.sort排序允许接受一个参数(函数),这个函数接受2个形参a,b,并且通过冒泡的方式比较。

//升序
arr.sort(function(a,b){
   return a - b;
})
var team = [1,2,3,4]
for (var i = 0, len = team.length; i < len; i++) {
  // 随机选择一个队友
  var randomIndex = i + Math.floor(Math.random() * (len - i));
  // 咱俩换换,找别人换过的相当于出列了,因此上面的 randomIndex 需要在剩下的人当中挑选
  var temp = team[i];
  team[i] = team[randomIndex];
  team[randomIndex] = temp;
}
console.log(team);

冒泡排序

两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

    function Bubble(arr){
        for(var i=0;i<arr.length-1;i++){
            for(var j=i+1;j<arr.length;j++){
                // 如果前面的大,交换位置
                if(arr[i]>arr[j]){
                    var temp = arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return arr;
    }

快速排序

  1. 找基准(一般是以中间项为基准)
  2. 遍历数组,小于基准的放在left,大于基准的放在right
  3. 递归
function quickSort(arr){
   //如果数组<=1,则直接返回
   if(arr.length<=1){return arr;}
   var pivotIndex=Math.floor(arr.length/2);
   //找基准,并把基准从原数组删除
   var pivot=arr.splice(pivotIndex,1)[0];
   //定义左右数组
   var left=[], 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 quickSort(left).concat(pivot, quickSort(right));
}

插入排序(适合小数据量)

直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表 排序过程大概如下:

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。
function insertSort(arr){
         var len = arr.length;
           for (var i = 1; i < len; i++) {
              var key = arr[i];//新元素
              var j = i - 1;//默认已排序的元素
              //在已排序好的队列中从后向前扫描
              while (j >= 0 && arr[j] > key) {
        //已排序的元素大于新元素,将该元素移到下个位置
                  arr[j + 1] = arr[j];
                  j--;
              }
             arr[j + 1] = key;
         }
        return arr;
        }

最佳情况:输入数组按升序排列。T(n) = O(n)

最坏情况:输入数组按降序排列。T(n) = O(n2)

平均情况:T(n) = O(n2)

二分插入排序

与直接插排最大的区别在于查找插入位置时使用的是二分查找的方式。

  1. 从第一个元素开始,认为该元素已排序;
  2. 取出下一个元素,在已排序序列中二分查找到第一个比它大的数的位置;
  3. 将元素插入到该位置后;重复上述两步。

选择排序

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  2. 再从剩余未排序元素中继续寻找最小(大)元素, 放到已排序序列的末尾
  3. 以此类推,直到所有元素均排序完毕。
function selectSort(arr){
        for(var i = 0; i < arr.length - 1; i++){
            var min = arr[i];
            for(var j = i + 1; j < arr.length - 1; j++){
                if(min > arr[j]){
                    var temp = min;
                    min = arr[j];
                    arr[j] = temp;
                }
            }
            arr[i] = min;
        }
        return arr;
    }

归并排序

把一系列排好序的子序列合并成为一个大的完整有序序列。