算法之排序篇

 

                                                  排序=比较+交换=无序区+有序区

js自带的排序,sort()函数。

sort()函数本质是上把所有的元素转换成String再排序,通过ASCII来排序,就会造成大小写,数字比较不是你想的结果

所以不推荐使用 arr.sort();

幸运的是,sort()方法是一个高级函数,可以接受一个比较函数来实现自定义的排序。修改了原数组

'use strict';
var arr=[2,1,23,4,2,4,4];
arr.sort(function (x,y) {
    if(x>y){
        return 1
    }
    if(x<y){
        return -1;
    }
    return 0;
});
console.log("+++++++++++++",arr);   1 2 2 4 4 4 23

若对字符串排序,要忽略大小写

ar arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
    x1 = s1.toUpperCase();
    x2 = s2.toUpperCase();
    if (x1 < x2) {
        return -1;
    }
    if (x1 > x2) {
        return 1;
    }
    return 0;
}); // ['apple', 'Google', 'Microsoft']

1、冒泡排序:

在无序区比较相邻的两个数,如果前一个数大于后一个数,就将这两个数换位置。每一次遍历都会将本次遍历最大的数冒泡到最后。为了将n个数排好序,需要n-1次遍历。 如果某次遍历中,没有调整任何两个相邻的数的位置关系,说明此时数组已排好序,可以结束程序。

<script>
    arr = [2, 3, 5, 16, 1, 2, 6, 3, 2]
    paixu(arr);
    function paixu(arr) {
        var flag = true;
        for (var i = 1; i < arr.length; i++) {    //表示本次是第i次遍历
            for (var j = 0; j < arr.length - i; j++) {
// 比较相邻的元素
                if (arr[j] > arr[j + 1]) {
                    // js方法交换
                    // var temp=arr[j];
                    // arr[j]=arr[j+1];
                    // arr[j+1]=temp;

                    // es6方法交换
                    [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
                    flag = false;
                }
            }
            // 走完j后还是没有交换flag=false
            if (flag) {
                break;
            }
        }
        console.log("+++++", arr);
    }

2、选择排序:

第i轮遍历arr[0:n-i]选出最大的数,与arr[n-i]互换。

输出是原序列的一个重排 ,它们通过对数组中的元素进行比较来实现排序,

//    自定义原型函数  如splice map等都是数组本身的原型方法。
    Array.prototype.selectSort = function () {
        var i, j;
        for (i = 1; i <=this.length-1; i++) {     // 共进行n-1趟排序  表示本次是第i趟排序,确定第几大的位置
            var maxIndex = 0;
//            比较   找到无序区里最大的值
            for (j = 0; j <= this.length - i; j++) {  //访问子序列为arr[0:this.length-i]
                if (this[j] > this[maxIndex]) {//当前值大于当前最大值时,记录索引
//                    找到最大的值
                    maxIndex = j;
                }
            }
            //交换     将最大值和有序区位置进行交换
            [this[this.length - i], this[maxIndex]] = [this[maxIndex], this[this.length - i]]
        }
    };

    var arr = [43, 21, 10, 5, 9, 15, 32, 57, 35];
    arr.selectSort();
    console.log(arr);

3、插入排序:有序区+无序区

<script>
    Array.prototype.insertSort = function () {
        var i, j;
        for (i = 1; i < this.length; i++) {  // i表示要插入的数字的索引,从第二个数开始前插
            var val = this[i]; // 记录当前要插入数组的大小
            /*
            * 用指针j(从后向前遍历i-1得位置开始)来遍历第i个数字前面的,已经排好序的子数组。当j没有指到头,并且j的数字大于要插入的数字时,说明
            * j还要向前遍历,直到发现一个比要插入数字小的位置pos,然后将这个数字插到pos+1处。如果j已经指到头了,
            * 到了-1了还没有找到比当前数字小的位置,就把当前数字放在索引0处。
            * */
            for (j=i-1;j>=0&&this[j]>val;j--) {
//              数据后移
                this[j+1]=this[j];
            }
//            插入val
            this[j+1]=val;
        }


    }
    var arr = [43, 21, 2, 3, 4, 1, 4];
    arr.insertSort();
    console.log("++++++++++", arr)
</script>

4、快速排序

<script>
    Array.prototype.quickSort=function (asc=true) {
      quickSort(this,0,this.length-1,asc);
    }
    function quickSort(arr,start,end) {
        if(start<end){
            // pivot记录枢轴插入的位置;
            var pivot= partition(arr,start,end);
            quickSort(arr,start,pivot-1);   // 递归的对temp左边的元素进行排序
            quickSort(arr,pivot+1,end);  // 递归的对temp右边的元素进行排序
        }
    }
    // 下面这个函数完成一趟排序
    function partition(arr,start,end) {
       // temp是枢轴,是待排序元素的第一个,一趟排序后,枢轴左边小于等于temp,右边大于等于temp
        var temp=arr[start];
        while (start!=end) {
            while (start<end&&arr[end]>temp) {end--;}   // 从右向左扫描找到一个小于temp的元素
            if(start<end){
                arr[start]=arr[end];  // 把右边值放到左边
                start++; // start 右移
            }
            while (start<end&&arr[start]<temp) {start++;}
            if(start<end){
                arr[end]=arr[start];// 把左边值放到右边
                end--;  // end左移
            }

        }
        arr[start]=temp;  //将temp放到最终位置,完成一次排序(小于或等于)temp(大于或等于)
        return start;
    }
    var arr=[49,38,65,97,76,13,27,49];
    arr.quickSort();
    console.log("+++++++++++",arr);
</script>

猜你喜欢

转载自blog.csdn.net/qq_38643776/article/details/83897125
今日推荐