JavaScript经典排序算法——快速排序

快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将待排序列分割成独立的两部分,其中一部分序列均比另一部分序列的元素小,则可分别对这两部分序列继续进行排序,以达到整个序列有序
首先在待排序记录中选取一个元素作为基准(pivot),然后将所有小于它的元素都安置在它的左边,所有大于它的元素都安置在它的右边。由此可以将该”枢轴“最后所落的位置i作为分界线,将原序列分为两个子序列R1……Ri-1和Ri+1……Rn。这个过程称为一趟快速排序。
一趟快速排序的具体做法是:设置两个指针i和j,开始时,i指向第一个元素,j指向最后一个元素,然后从j所指位置起向前搜索找到第一个小于”基准“的元素与”基准“进行互换,接着从i所指位置开始向后搜索,找到第一个大于”基准“的元素与”基准“进行互换,重复这两步直至i=j
步骤分析:
第一步:找基准,一般是将第一个元素作为基准;
第二步:遍历序列,把所有小于“ 基准 的元素放在left子序列中,大于“ 基准 的放在right子序列中;
第三步:对分割的两个子序列进行递归上述两步,直至整个序列有序。

动图演示:


快速排序过程:


JavaScript代码实现:

function quickSort(arr){
  if(arr.length<=1){
    return arr;
  }else{
    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++){   //比基准小的放left,比基准大的放right
            if(arr[i]<=pivot){
                left.push(arr[i]);
            }else{
                right.push(arr[i]);
            }
        }
    return quickSort(left).concat([pivot],quickSort(right));
  }
}

var arr = [27,38,12,39,27,16];
console.log(quickSort(arr)); //12,16,27,27,38,39

猜你喜欢

转载自blog.csdn.net/dff1993/article/details/80082025
今日推荐