zoukankan      html  css  js  c++  java
  • 排序算法-快速排序(javascript)

    快速排序

    算法思想:在待排序数组中,首先任意选取一个数据作为关键数据(通常取第一个或中间一个),然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。再递归直到结束排序。

    从j开始向前搜索(j--),遇到小于key的就将array[j]与array[i]交换;从i往后搜索(i++),遇到大于key的就将array[i]与array[j]交换;再递归。

    举个栗子:  

    将第一个数字作为关键数据 key=6;

    6  2  7  3  8  9  此时i=0;j=5;

    3  2  7  6  8  9  此时i=0;j=3;

    3  2  6  7  8  9  此时i=2;j=3;

    3  2  6  7  8  9  此时i=j=2;第一次循环结束

    function quickSort(array){
        function sort(prev, numsize){
            var i = prev;
            var j = numsize -1;
            var key = array[prev];
            if ((numsize - prev) > 1) {
                while(i < j){
                    for(; i < j; j--){
                        if (array[j] < key) {
                            array[i++] = array[j]; //a[i] = a[j]; i += 1;
                            break;
                        };
                    }
                    for( ; i < j; i++){
                        if (array[i] > key){
                        array[j--] = array[i];
                        break;
                        }
                    }
                }
                array[i] = key;
                sort(0, i);
                sort(i + 1, numsize);
            }
        }
        sort(0, array.length);
        return array;
    }

    另外还有一种简单易懂的方法:

    设置两个空数组left和right,将整个数组进行遍历,遇到小于关键数据的就push进left,否则放进right。此处以中间数作为关键数据更好理解。

    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));
    }

     

  • 相关阅读:
    学习Node.js笔记(一)
    HTML5的新特性及技巧分享总结
    前端切图的一些笔记(整理的有点乱)
    聊一聊前端速度统计(性能统计)那些事儿(转)
    jQuery中的checkbox问题
    随笔记录
    pillow模块快速学习
    Git学习及使用
    网站(陆续更新)
    ggplot笔记001——ggplot2安装
  • 原文地址:https://www.cnblogs.com/PeriHe/p/7906382.html
Copyright © 2011-2022 走看看