常用排序方法

来源:互联网 发布:黑魔盒 淘宝 编辑:程序博客网 时间:2024/05/16 08:21

冒泡排序 时间复杂度 n²,稳定

每两个相邻的元素比较大小,大的放后面

function BubbleSort() {                var arr = [3,2,5,8,4,7,6,0,9,1];                for( i=0 ; i<arr.length ; i++ ) {                    for( j=0 ; j<arr.length ; j++ ) {                        if(arr[i] < arr[j]) {                            num = arr[i];                            arr[i] = arr[j];                            arr[j] = num;                        }                    }                    console.log(arr);                }            }        BubbleSort();

冒泡排序

快速排序 时间复杂度 n㏒₂n,不稳定

找一个基准值,遍历数组将数组中小于基准值的数组成一个数组放在基准值左边,大于基准值的数组成一个数组放在基准值右边,再让分别让左边数组和右边数组调用函数quickSort。

function quickSort(arr) {          if (arr.length <= 1) { return arr; }          var pivotIndex = Math.floor(arr.length / 2);          var pivot = arr.splice(pivotIndex, 1)[0];//找一个基准值          var left = [];          var right = [];          for (var i = 0; i < arr.length; i++){            if (arr[i] < pivot) {              left.push(arr[i]);            } else {              right.push(arr[i]);            }          }          return quickSort(left).concat([pivot], quickSort(right));            };        var array = [3,2,5,8,4,7,6,0,9,1];        console.log(quickSort(array));

插入排序 时间复杂度为n²,稳定

在数组中选择一个基准值放在新数组里,然后依次用数组中的数与之作比较,比其小的放在新数组的元素左边,比其大的放在值的右边,第二次与之作比较完还要再进行一次循环,判断它的大小(与新数组最后一个值或者第一个值比较),使其放在合适的位置。

function InsertSort() {            var org = [5, 4, 3, 2, 1, 6, 7, 9, 8, 10];            var tempArr = new Array();            for (var i = 0; i < org.length; i++) {                if (i == 0) {                     tempArr[0] = org[0]; //把第一个元素放到新序列                } else {                        for (var j = 0; j < tempArr.length; j++) {                            if (org[i] > tempArr[j]) {                                //如果是新序列的最后一个元素,则插入                                if (j == tempArr.length - 1) {                                    tempArr[j + 1] = org[i];                                    break;                                } else {//如果不是最后一个元素,则往后移动                                    continue;                                }                            } else {                                //移动新序列、然后插入                                for (var k = tempArr.length - 1; k >= j; k--) {                                    tempArr[k + 1] = tempArr[k];                                }                                tempArr[j] = org[i];                                break;                            }                        }                    }                }                console.log(tempArr);        }        InsertSort();

直接选择排序 时间复杂度为n²,不稳定

遍历数组,找到最小的数的下标,然后判断其是不是第一个数,如果不是更第一个数交换位置,以此类推。这样选择排序的每个最小值的筛选.只需要一次元素的交换。

    function choseSort() {        var arr = [3,2,5,8,4,7,6,0,9,1];        for(var j=0 ; j<arr.length ; j++){            var min = arr[j];            var num = j;            //找到最小值            for(var i=j ; i<arr.length ; i++ ){                if(min > arr[i]){                    min = arr[i];                }            }            //找到最小值的序号            for(var i=j ; i<arr.length ; i++ ){                if(min == arr[i]){                    num = i;                }            }            //交换第一个值和最小值            arr[num]=arr[j];            arr[j]=min;        }            console.log(arr);    }    choseSort();

归并排序 时间复杂度为n㏒₂n,稳定

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

var arr = [3,2,5,8,4,7,6,0,9,1];function merge(left, right) {    var re = [];    while(left.length > 0 && right.length > 0) {        if(left[0] < right[0]) {                re.push(left.shift());            } else {                re.push(right.shift());            }        }        /* 当左右数组长度不等.将比较完后剩下的数组项链接起来即可 */        return re.concat(left).concat(right);}function mergeSort(array) {    if(array.length == 1) return array;        /* 首先将无序数组划分为两个数组 */        var mid = Math.floor(array.length / 2);        var left = array.slice(0, mid);        var right = array.slice(mid);        /* 递归分别对左右两部分数组进行排序合并 */        return merge(mergeSort(left), mergeSort(right));}    console.log(mergeSort(arr));
1 0
原创粉丝点击