排序算法-高级排序

1.希尔排序

希尔排序是插入排序的升级版本,是将元素按步距分组,在分组内进行插入排序,然后按一定规律缩小步距,步距为1时进行最后一次插入排序。

初始步距是用(nums.length/2)的向下取整。用步距分组排好序后,步距为(原步距/2)的向下取整。步距可以理解为2个元素相隔的距离。

可以将插入排序的代码稍微调整一下。

其中,将插入排序的第二个for循环里面的(i>0)调整成(i>=1),将i--调整成(i=i-1),这样代码的效果是一样的。

修改的1其实就是步距为1,if里面的比较就是比较2个步距为1的元素。(最外层的1是第一个待插入数的索引)

将调整后的插入排序中的1改成意义为步距的变量就是希尔排序的核心代码,此外只需要让步距依次减小直至为1。

修改后希尔排序的代码如下。

 


 快速排序

将第一个数作为锚点,并用一个变量储存起来。左指针(left)停留在数组左边第一个数上,右指针(right)停留在数组右边第一个数上。

如果right指向的值比锚点小,那么将right指向的值赋值给此时左指针指向的值。否则right向左移动。

如果left指向的值比锚点大,那么将left指向的值赋值给此时右指针指向的值。否则left向右移动。

 

 随着right不断向左移动,left不断向右移动,left和right会指向一个地方,此时指针不再移动,并将存储起来的锚点赋值给此时指针指向的值。

这一轮下来让锚点排好了序,用锚点将数组切割成左右两部分,每部分重新进行上面的操作。

    var partition=function(left,right){
        var pivot = nums[left];
        while(left < right){
            while(left<right && nums[right] >= pivot)
                right--;//right向左移动
            nums[left] = nums[right];
            while(left < right && nums[left]<= pivot)
                left++;//left向右移动
            nums[right] = nums[left];
        }
        nums[left] = pivot;
        console.log("索引",left,"p",nums[left],"数组",nums);
        return left;
    }

    //排序
    var quickSort=function(left,right){
        var middle;
        if(left < right){
            middle = partition(left,right);//将锚点排好序
            quickSort(left,middle-1);//递归
            quickSort(middle+1,right);//递归
        }
    }

    quickSort(0,nums.length-1);

 

posted @ 2021-09-10 15:58  请叫我小马驹  阅读(65)  评论(0编辑  收藏  举报