zoukankan      html  css  js  c++  java
  • JS实现快排算法

         快速排序算法的实现主要采用的是类似于分治的思想的,将一个长的待排序的序列切割成两个,如果还是足够长,就继续切割的。这里的足够长其实只要是多余一个的,都可以切。
    所以解决的关键在于怎么进行这个划分,将长的序列切短。这里选择一个切割的标准的S,将S放在中间,小于S的放在左边,大于S的放在右边。于是继续可以用递归来完成实现。

    在一个快速排序普遍的版本中,使用的是序列的最后一个元素来作为标准S的。下面实现了一个较为简单的快速排序:

    //JS实现快速排序(从小到大排列)
    if(typeof Array.prototype.quickSort !== 'function') {
        Array.prototype.quickSort = function() {
            quickSortHelper(this, 0, this.length-1);
            //确定哨兵, 递归分离
            function quickSortHelper(arr, start, end) {
                if(start < end){                //快排结束条件start>=end
                    //获取哨兵的位置
                    var part = partation(arr, start, end);
                    
                    //根据递归实现排序
                    arguments.callee(arr, start, part-1);
                    arguments.callee(arr, part+1, end);
                }         
            }
            function partation(arr, start, end) {
                var pivot = arr[end];               //设置哨兵
                var i = start;                      //交换的次数+1 哨兵要在数组插入的位置
                for(var j=start; j<end; j++) {
                    if(arr[j] < pivot) {
                        swap(arr, i, j);
                        i++;
                    }
                }
                swap(arr, i, end);
                return i;
            }
            //交换数组元素的值
            function swap(arr, i, j) {
                var temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    
    //------------------- test ------      
    var arr = [5, 2, 3, 1, 4];
    arr.quickSort();
    console.log(arr);

     更新2013-08-04

    快速排序的思想很简单,整个排序过程只需要三步:

    1. 在数据集中,选择一个元素作为“基准”(pivot)
    2. 所有小于“基准”的元素,都移到“基准”的左边,所有大于“基准”的元素,都移到右边。
    3. 对“基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    实现代码如下:

    var quickSort = function(arr) {
        if(arr.length <= 1) return arr;             // 递归停止条件
        // 选取基准值
        var pivotIndex = Math.ceil(arr.length / 2);
        var pivot = arr.splice(pivotIndex, 1)[0];   // 基准值
        var left = [], right = [];
    
        // 如果大于基准值,移到数组right中;小于基准的值,移到数组left中
        for(var i=0; i< arr.length; i++) {
            arr[i] > pivot ? right.push(arr[i]) : left.push(arr[i]);
        }
    
        return quickSort(left).concat([pivot], quickSort(right));
    
    };
  • 相关阅读:
    深入理解Kafka-学习笔记04-部分生产者客户端参数
    深入理解Kafka-学习笔记03-消息有序性
    IDEA包不存在找不到包解决方案
    深入理解Kafka-学习笔记02-生产者整体架构
    深入理解Kafka-学习笔记01-初识Kafka
    ClickHouse与MySQL数据类型对应
    MySQL查看版本
    从apache phoenix表提取数据为CSV
    Kafka查看版本
    HBASE查看版本
  • 原文地址:https://www.cnblogs.com/mackxu/p/quicksort.html
Copyright © 2011-2022 走看看