OK,排序这一个篇章也快要结束了。

这一篇主要说的是快速排序,说的方式主要还是先说原理,然后再用代码来进行实现。


所谓快速排序,就是分为三步走:

第一步:选择第一个数字分离出来为基数
第二步:然后将序列中大于基数的放在基数右边,小于基数的放在基数的左边
第三步:然后对基数的左边和右边两个序列重复第二步和第三步

这样就能形成一个有序的序列,那么重点是我们如何来实现第二步这个过程呢?

我们用图解来说明一下。


倘若我们有这样一个序列

javascript dict排序 js实现排序_排序算法


现在我们按步骤来,先把第一个元素4储存起来。

然后定义两个指针分别指向第一个元素和最后一个元素。

javascript dict排序 js实现排序_排序算法_02


然后我们让j先移动(记住一定是j先移动),一旦碰到比基数小的我们就停止移动,并且把j位置的值赋给i位置上的值。

javascript dict排序 js实现排序_javascript dict排序_03


好现在j停下来,我们让i移动,一旦碰到比基数大的值,就把i位置上的值赋给j位置上的值。

javascript dict排序 js实现排序_数据结构_04


OK,现在i停下来,j移动。

javascript dict排序 js实现排序_两个指针_05


J停下来,i移动

javascript dict排序 js实现排序_数据结构_06


i停下来,j移动

javascript dict排序 js实现排序_javascript dict排序_07


j停下来,i移动

javascript dict排序 js实现排序_排序算法_08


i停下来,j移动

javascript dict排序 js实现排序_排序算法_09


然后最后i再移动一下

javascript dict排序 js实现排序_快速排序_10


此时i和j所处的位置是一样的

这个时候我们把基数放在i和j共同的位置上就可以了。

javascript dict排序 js实现排序_快速排序_11


这样就能做到基数4左边都是比自己小的,右边都是比自己大的。

这样这个基数的位置就找到了。现在我们再对基数左边的序列和右边的序列重复上面的步骤,就可以得到一个有序的序列啦。

javascript dict排序 js实现排序_数据结构_12


现在我们用代码来实现一下

<script>
        function sort(arr,begin,end){
            if(begin < end){
                let i = begin;
                let j = end;
                let empty = arr[begin];
                while(i < j){
                    while(arr[j] > empty && i < j){
                        j --;
                    }
                    arr[i] = arr[j];
                    while(arr[i] < empty && i < j){
                        i ++;
                    }
                    arr[j] = arr[i];
                }
                arr[i] = empty;
                sort(arr,begin,i-1);
                sort(arr,i+1,end);
            }else{
                return;
            }
        }

        let arr = [2,3,1,4,8,7,9,6];
        sort(arr,0,7);
        console.log(arr);
    </script>

OK,关于快速排序也就说完了。