5个排序算法

1. 冒泡排序

/*
算法描述
1.比较相邻元素,若第一个大于第二个,交换他们。
2.重复第一步,最后的数将会最大。
3.重复以上步骤,除了最后一个数
4.继续重复以上步骤,直到没有任何一对数需要比较。

*/
    function bubbleSort(arr) {                                          //参数:数组;返回值。
        var 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]) {                                 //相邻两个元素比较
                    let temp = arr[j + 1];                                 //元素交换
                         arr[j + 1] = arr[j];
                         arr[j] = temp;
                }
            }
        }
        return arr;                                                              //返回排完序数组
    }
    alert(bubbleSort([21,78,15,36,59,11,34,25,13]));      //11,13,15,21,25,34,36,59,78

2.快速排序

/*
快排算法描述
1.找基准点。
2.建立两个空数组。
3.arr中大于基准点放left,则反之。
4.left,基准点,right连接起来。
*/


function quicksort(arr) {                                              //参数类型:数组;返回值,数组。
        if (arr.length <= 1) {
            return arr;
        }
        var equally = Math.floor(arr.length / 2);                      //arr中间索引
        var benchmark = arr.splice(equally,1);                         //arr中间值
        var left = [];
        var right = [];
        for (var i = 0,len = arr.length; i < len; i++) {
            if (arr[i] < benchmark) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return quicksort(left).concat([benchmark],quicksort(right));    //不断递归,最后都递归为一个数,然后拼接数组,返回排完序数组。
    }
    alert(quicksort([21,81,12,85,31,97,18,2,87,75,3]));      //output:2,3,12,18,21,31,75,81,85,87,97

  

 3.选择排序

  

/*
算法描述
1.与第一个数比较,如果大于它,则交换位置
2.重复第一步,一遍循环,第一个数是最小值;
3.重复n-1次循环,OK。
*/


 function selectSort(arr) {                                     //参数:数组;返回值:数组。
        var len = arr.length;
        var temp;
        for (var i = 0; i < len - 1; i++) {
            for (var j = j + 1; j < len; j++) {
                if (arr[j] < arr[i]) {                               //与第一个数比较
                    temp = arr[j];                                  //交换位置
                    arr[j] = arr[i];
                    arr[i] = temp;                                     
                }
            }
        }
        return arr;                                                   //返回数组
    }
    alert(selectSort([14,52,18,78,54,114,65,28,56]));  //14,52,18,78,54,114,65,28,56

  

 4.插入排序
/*
算法描述
1.第一个数a[0]与第二个数a[1]比较,若a[0] > a[1],则 a[1] = a[0]
2.关键是第三个数a[2],a[2]先与a[1],若a[2] < a[1],则交换位置,此时a[1]再与a[0]比较大小。
*/


 function insertSort(arr) {                            //参数:数组;返回值:数组。
          for (let i = 1,len = arr.length; i < len;i++) {
              for (let j = i - 1; j >= 0;j--) {        //j--:若a[2] < a[1],指针退1。
                  if (arr[j] > arr[j + 1]) {           //比较相邻两数大小
                      let temp = arr[j + 1];
                      arr[j + 1] = arr[j];
                      arr[j] = temp;
                  }
              }
          }
          return arr;                                   //返回数组
      }
alert(insertSort([12,85,42,67,34,56,19,97,47]));  //12,19,34,42,47,56,67,85,97

  

 
5.归并排序

/*
算法描述
1.把arr分成left,right子序列;
2.比较left,right大小,返回排完序数组,递归两次;
3.递归与栈相关,弹出并返回的值执行其他动作。
*/

function mergeSort(arr) {                                  //参数类型:数组;返回:数组。
        if (arr.length < 2) {
            return arr;
        }

        const middle = Math.floor(arr.length / 2);         //中间值
        const left = arr.slice(0,middle);                  //left[]
        const right = arr.slice(middle);                   //right[]  
        return merge(mergeSort(left),mergeSort(right));    //递归两次
    }

    function merge(left,right) {
        var newArr = [];
        while (left.length && right.length) {              
            if (left[0] < right[0]) {                       //子序列比较大小
                newArr.push(left.shift());
            } else {
                newArr.push(right.shift());
            }
        }
        return newArr.concat(left,right);                    //返回合并好的了子序列
    }

    alert(mergeSort([54,24,15,95,75,35,68,78,12,31,108]));   //12,15,24,31,35,54,68,75,78,95,108

  

原文地址:https://www.cnblogs.com/Longhua-0/p/9292298.html