排序

200 阅读3分钟

冒泡排序

所谓冒泡排序,就是从第一个元素开始,用下一个元素和当前元素做比较,如果下一个元素大于当前元素,就交换双方的位置,第一轮结束时,最后一个元素就是数组中最大的值;第二轮结束时,拿到倒数第一个最大的值,如此往返循环;

注意:因为冒泡排序每次都会拿到当前参与项中最大的一个值,所以第一层for循环,每遍历一次都会减少一次,这也是为了节约性能,对于已经排列的好的各项,不再参与遍历;

function bubbleSort(arr) {
    // 判断是否为数组
    function isArray(arr) {
        return Array.isArray(arr);
    }
    // 交换位置
    function changePosition(arr, minIndex, maxIndex) {
        let maxValue = arr[maxValue ];        
        arr[maxIndex] = arr[minIndex];
        arr[minIndex] = maxValue;
    }
    if (!isArray(arr)) {
        throw '不是一个数组';
    }
    for (let i = arr.length-1; i > 0; i-- ) {
        for (let j = 0; j < i; j++) {
             if (arr[j] > arr[j+1]) {
                 changePosition(arr, j, j+1);
             }
        }
    }
    return arr;
}


插入排序

  • 第一个元素默认是已排序元素,取出下一个元素和当前元素比较,如果当前元素大,就交换位置,第一轮遍历结束;
  • 进行第二轮遍历,此时,前两位元素已经做好排序,此时第二个元素作为当前元素,再拿第三个元素和当前元素做比较,如果当前元素大,就交换位置,此时第二个元素作为当前元素,当前元素和第一个元素做比较,如果第一个元素大就交换位置,如此往复;
  • 讲的比较绕口,请看代码:

function insertSort(arr) {
    function isArray(arr) {
        return Array.isArray(arr);
    }
    function changePosition(arr, minIndex, maxIndex) {
        let maxValue = arr[maxIndex];
        arr[maxIndex] = arr[minIndex];
        arr[minIndex] = maxValue;
    }
    for (let i = 1; i < arr.length; i++) {
        // 注意此处:arr[j] > arr[j+1]也是为了节约性能,可以思考下;
        for (let j = i - 1; j >= 0 && arr[j] > arr[j+1]; j--) {
             changePosition(arr, j, j+1)
        }
    }
    return arr;
}


快速排序

所谓快速排序,就是在数组中找一个基点,将大于这个基点的放于右侧,小于基点的放于左侧;然后对两侧的数据进行递归调用,直到每个数组中只保留一个值,以实现快排;

function quickSort(arr) {
    function isArray(arr) {
         return Array.isArray(arr);
    }
    if (!isArray(arr)) throw '不是一个数组';
    if (arr.length <= 1) return arr;
    let pivotIndex = Math.floor(arr.length / 2);
    let pivot = arr.splice(pivotIndex, 1)[0];
    let leftArr = [];
    let rightArr = [];
    for (let i = 0; i < arr.length; i++) {
         if (arr[i] < pivot) {
              leftArr.push(arr[i]);
         } else {
              rightArr.push(arr[i]);
         }
    }
    return quickSort(leftArr).concat([pivot], quickSort(rightArr));
}


选择排序

所谓选择排序,从第一轮遍历开始设置默认最小值的索引为0,依次遍历数组,如果下一个元素比当前索引的最小值小,则设置该元素的索引为最小值的索引,一轮遍历结束后,交换第一个元素和最小值元素的位置;如上反复操作;

function selectSort(arr) {
    function isArray(arr) {
         return Array.isArray(arr);
    }
    if (!isArray(arr)) {
         throw '不是一个数组';
    }
    function changePosition(arr, minIndex, maxIndex) {
         let maxValue = arr[maxIndex];        
         arr[maxIndex] = arr[minIndex];
         arr[minIndex] = maxValue;
    }
    for (let i = 0; i < arr.length; i++) {
         let minIndex = i;
         for (let j = i + 1; j < arr.length; j++) {
              minIndex = arr[j] < arr[minIndex] ? j : minIndex;
         }
         changePosition(arr, minIndex, i);
    }
    return arr;
}

第一次写,写的不好欢迎批评指正,谢谢!