整理-排序算法

110 阅读1分钟

插入排序

/**
 * 插入排序
 * 首先设第一个元素为有序
 * 从第二个起与前面的有序部分进行比较,比有序的小则有序的后移一位,否则插入
 * @param {*} arr 
 */
function insertSort(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) {// current与有序区比较
            arr[preIndex + 1] = arr[preIndex]; // current比有序的小则后移一位
            preIndex--;
        }
        // 如果比较完了即preIndex=-1,current还是比有序的小,则current放在第一位
        // 如果current比有序的大,则current要放在preIndex后面
        arr[preIndex + 1] = current;
    }
    return arr;
}
  1. 5, 3, 7, 6, 1
  2. 5, 5, 7, 6, 1
  3. 3, 5, 7, 6, 1
  4. 3, 5, 7, 6, 1
  5. 3, 5, 7, 7, 1
  6. 3, 5, 6, 7, 1
  7. 3, 5, 6, 7, 7
  8. 3, 5, 6, 6, 7
  9. 3, 5, 5, 6, 7
  10. 3, 3, 5, 6, 7
  11. 1, 3, 5, 6, 7
  12. 1, 3, 5, 6, 7

快速排序

冒泡排序

/**
 * 冒泡排序
 * 两层循环,相邻元素比较,第一轮后最后一个是最大的
 * 和选择排序第一轮后第一个是最小的相反
 * @param {*} arr 
 */
function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) {
        for (var 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;
}

选择排序

/**
 * 选择排序
 * 两层循环,第二层循环找出最小的数,
 * 完了将值替换到第一层循环的当前序号,
 * 直到第一层循环遍历完
 * @param {*} arr 
 */
function selectionSort(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;
} 

归并排序

blog.csdn.net/xiaoxiaojie…