JavaScript实现各类排序

0 最原始的排序

这里先把排序作一个分类,根据是否额外开辟空间分为内排序和外排序,其中内排序根据操做能够分为交换排序、选择排序、插入排序和周并排序。这是最先会的一种最low的排序方式,也属于交换排序javascript

function theLowestSort(arr) {
     for (var i = 0; i < arr.length; 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;
            }
       }
    }
}
复制代码

1 冒泡排序(bubble sort)

// 冒泡排序属于交换排序 基本思想为相邻两两比较 后者小于前者则交换 这样小值一步一步交换到前列
function bubbleSort(arr) {
    for (var i = 0; i < arr.length; i++) {
        for (var j = arr.length - 1; j >= i; j--) {
            // 最后一位开始 依次与相邻元素比较和交换
            // 注意:永远是相邻元素!才是冒泡
            if (arr[j] > arr[j + 1]) {
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
复制代码

2 简单选择排序(simple selection sort)

// 简单选择排序属于选择排序 基本思想为每次遍历都找出当前循环的最小项与第i位置元素交换 其交换次数远小于冒泡排序 因此效率高于冒泡
function simpleSelectionSort(arr) {
    for (var i = 0; i < arr.length; i++) {
        var min = i; // 因为i从0开始 先定义最小值是i
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j; // 每当有元素更小 就用下标刷新min值
            }
        }
        if (i !== min) {
            var temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }
}
复制代码

3 直接插入排序(straight insertion sort)

// 直接插入排序属于插入排序 将数组分为两部分 前半部分有序 后半部分无序 依次选择无序部分第一项与前面有序部分比较 找到合适位置插入
function straightInsertionSort(arr) {
    // 假设第0个元素单独为有序 因此从第1个元素开始
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] < arr[i - 1]) {
            var guard = arr[i]; // 当前项比前一项小 计划前移 先作一个标记
            var j = i - 1;
            arr[i] = arr[j]; // 前一项赋值到当前项 这是当前项挨个往前比较的开端
            while (j >= 0 && guard < arr[j]) {
                // 挨个往前比较 当前项比前一项大时跳出循环
                arr[j + 1] = arr[j]; // 从后往前遍历 每一项都日后一项赋值 总体后移
                j--;
            }
            arr[j + 1] = guard; // 标记赋值到当前项 因为while循环中j-- 须要j+1给加回来 即当前项arr[i]
        }
    }
}
复制代码

以上1 2 3三种排序时间复杂度都是O(n^2)java

未完待续。。。数组

相关文章
相关标签/搜索