• 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));
    
    };
  • 相关阅读:
    Deep learning:三十八(Stacked CNN简单介绍)
    机器学习&数据挖掘笔记_11(高斯过程回归)
    Deep learning:三十九(ICA模型练习)
    机器学习&数据挖掘笔记_9(一些svm基础知识)
    机器学习&数据挖掘笔记_10(高斯过程简单理解)
    本人部分博客导航(ing...)
    算法设计和数据结构学习_3(《数据结构和问题求解》part2笔记)
    Deep learning:三十七(Deep learning中的优化方法)
    C++笔记(2):《数据结构和问题求解》part1笔记
    算法设计和数据结构学习_4(《数据结构和问题求解》part4笔记)
  • 原文地址:https://www.cnblogs.com/mackxu/p/quicksort.html
Copyright © 2020-2023  润新知