前端面试经常问(冒泡和快排)以及稳定性问题

刚接触秋招,就听见很多人在说面试一来就撕代码的。我向别人取了点经,总结一下冒泡和快排,后面再总结哈排序算法中的稳定性:

冒泡排序:(应用于数据规模很小)

冒泡通俗讲就是参与排序的数据就像水中的气泡慢慢浮出水面一样“浮”到数列顶端。

冒泡排序要点:

1、  两层循环,外层循环控制走访数列重复进行的次数,内层循环进行数据的比较、交换,是数据“上浮”。

2、  内层循环是相邻的数据进行比较。

比如:有一个数组arr=[1,5,8,2,4,9],内层循环就是1跟5比,然后5跟8比,,,,,就这样一直比。

<script>
    var arr = [9, 2, 4, 1, 8];
    function bubbleSort(arr) {
        var i = arr.length;
        var j;
        var temp;
        while (i > 0) {
            for (j = 0; j < i - 1; j++) {
                console.log(arr[j],arr[j+1]);//检测如何冒泡的
                console.log("------------");
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            console.log("i===="+i);
            i--;
        }
        return arr;
    }
    console.log(bubbleSort(arr));
</script>

数组外循环次数就为数组长度。每一次外循环在内循环两两比较后,得到一个最大的值排到数组尾部。

快速排序:

快速排序思想:

  1 先找数组的最中间的一个数为基准

  2 把数组通过此基准分为小于基准的left数组和大于基准的right数组,

  3 递归重复上面的两个步骤,

<script>
    var arr = [90,9,12,6,30,60,36,32,40];
    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));
    }
    //concat() 方法用于连接两个或多个数组,该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
    console.log(quickSort(arr));
</script>

分组,找一个基准,小的数放左边,大的数放右边,依次分组直到数组元素为一

排序算法中:

不稳定:快速排序,选择排序,堆排序,希尔排序(快选堆希)

稳定:插入排序,冒泡排序,归并排序,基数排序(插冒归基)

算法的稳定性判断排序前2个相等的数在序列中的前后位置顺序与排序后它们两个的前后位置顺序相同

猜你喜欢

转载自blog.csdn.net/qq_41999617/article/details/82859309