js常用排序方法

桶排序

桶排序只能对正整数进行排序,利用js的数组特性,创建一个新数组作为桶,然后遍历原数组,将值放入对应的桶中,就是将原数组每一项的值作为新数组的索引,该方法为去重排序
function sortT(arr) {
    var index = [];
    for (let i = 0; i < arr.length; i++) {
        if (parseInt(arr[i]) == arr[i]) {
            index[arr[i]] = 1
        } else {
            alert("请输入整数")
        }
    }
    arr = [];
    for (var key in index) {
        arr.push(key * 1)
    }
    return arr
}

选择排序

假设一个最小值,然后依次和剩下的数据比较,如果比最小值小记录下最小值和对应的索引,一轮比完后一定能找到一个最小的值,将这个最小值与假设的最小值交换位置,重复这个过程找到第二小的值,以此类推就能的到一个有序的数据。

function sortSelect (arr){
    var temp;
    for (var i = 0; i < arr.length-1; i++) {
      for (var j = i; j < arr.length; j++) {
         if(arr[j] <= arr[i]){
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp; 
         }   
      }       
    }
    return arr
}

这里我用了另一种实现方法,不再记录最小值和索引而是直接与假设的最小值交换位置。代码结构就与冒泡排序差不多了。

冒泡排序

经典的排序算法,数据两两比较大的往后移或者往前移,

function sortBubble (arr){
   var temp;
   for (var i = 0; i < arr.length-1; i++) {
     for (var j = 0; j < arr.length -i-1; j++) {
        if(arr[j] >= arr[j+1]){
           temp = arr[j];
           arr[j] = arr[j+1];
           arr[j+1] = temp; 
        }   
     }       
   }
   return arr
}

快速排序

  1. 找出一组数据中间的数据,创建两个新数组,遍历原数组,依次和找到的那个中间值比较,比它小的放在一个数组,比它大的放在一个数组。然后对左边和右边的数组进行同样的操作,最后将这些数组连接起来就能得到一个排好序的数据
function quickSort(arr) {
    if (arr.length <= 1) {
        return arr
    }
    var midIndex = parseInt(arr.length / 2);
    var mid = arr[midIndex];
    var left = [];
    var right = [];
    for (var i = 0; i < arr.length; i++) {
        if (i == midIndex) {
            continue
        }
        if (arr[i] < mid) {
            left.push(arr[i])
        } else {
            right.push(arr[i])
        }

    }
    return quickSort(left).concat([mid], quickSort(right))
}
  1. 快速排序还有一种实现方法但比第一个更复杂
function quickSort(arr) {
    var left = 0; //左边起点
    var right = arr.length - 1; //右边起点
    quicksort(left, right, arr) //初始调用
    function quicksort(left, right, arr) {
        if (left > right) { //如果左边起点大于右边起点,递归结束
            return;
        }
        var temp = arr[left], //目标数据
            tag,
            i = left, //左边节点
            j = right; //右边节点
        while (i != j) { //循环终结条件
            while (arr[j] >= temp && j > i) { //从后往前找到大于目标数据的那一项
                j--;
            }
            while (arr[i] <= temp && j > i) { //从前往后找到小于目标数据的那一项
                i++;
            }
            if (i < j) { //如果i和j没有相遇,交换找到的那两个值
                tag = arr[i];
                arr[i] = arr[j];
                arr[j] = tag;
            }
        }
        arr[left] = arr[i];
        arr[i] = temp;
        quicksort(left, i - 1, arr);
        quicksort(i + 1, right, arr)
    }
}

猜你喜欢

转载自blog.csdn.net/evail_/article/details/107285318