zoukankan      html  css  js  c++  java
  • javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    一、快速排序算法

    /*
    * 这个函数首先检查数组的长度是否为0。如果是,那么这个数组就不需要任何排序,函数直接返回。
    * 否则,创建两个数组,一个用来存放比基准值小的元素,另一个用来存放比基准值大的元素。
    * 这里的基准值取自数组的第一个元素。
    * 接下来,这个函数对原始数组的元素进行遍历,根据它们与基准值的关系将它们放到合适的数组中。
    * 然后对于较小的数组和较大的数组分别递归调用这个函数。
    * 当递归结束时,再将较大的数组和较小的数组连接起来,形成最终的有序数组并将结果返回。
    * */
    function qSort(arr){
        if (arr.length == 0) {
            return [];
        }
        var left = [];//存储小于基准值
        var right = [];//存储大于基准值
        var pivot = arr[0];
        for (var i = 1; i < arr.length; i++) {
            if (arr[i] < pivot) {
                left.push(arr[i]);
            } else {
                right.push(arr[i]);
            }
        }
        return qSort(left).concat(pivot, qSort(right));
    }
    var a = [];
    for (var i = 0; i < 10; ++i) {
        a[i] = Math.floor((Math.random()*100)+1);
    }
    //console.log(a);
    console.log("排序前: "+a);
    console.log("排序后: "+qSort(a));

    二、希尔排序算法

    function CArray(numElements,gaps) {
        this.dataStore = [];
        this.pos = 0;//是一个索引值,默认为0,从第一个开始
        this.numElements = numElements;//是保存所有的数组元素
        this.insert = insert;//向数组中插入一个元素的方法
        this.toString = toString;//显示数组中所有元素
        this.clear = clear;//清空数组数据
        this.setData = setData;//生成了存储在数组中的随机数字
        this.gaps = gaps;//定义间隔序列
        this.shellSort = shellSort;//希尔排序
    
        /*将传入的数组,存储在datastore中*/
        for (var i = 0; i < numElements.length; ++i) {
            this.dataStore[i] = numElements[i];
        }
    }
    
    function setData() {
        for (var i = 0; i < this.numElements; ++i) {
            this.dataStore[i] = Math.floor(Math.random() *
                (this.numElements+1));
        }
    }
    
    function clear() {
        for (var i = 0; i < this.dataStore.length; ++i) {
            this.dataStore[i] = 0;
        }
    }
    
    function insert(element) {
        this.dataStore[this.pos++] = element;
    }
    
    function toString() {
        var retstr = "";
        for (var i = 0; i < this.dataStore.length; ++i) {
            retstr += this.dataStore[i] + " ";
            if (i > 0 && i % 10 == 0) {
                retstr += "
    ";
            }
        }
        return retstr;
    }
    
    /*
    * 外循环控制间隔序列的移动。也就是说,算法在第一次处理数据集时,会检查所有间隔为5的元素。
    * 下一次遍历会检查所有间隔为3的元素。
    * 最后一次则会对间隔为1的元素,也就是相邻元素执行标准插入排序。
    * 在开始做最后一次处理时,大部分元素都将在正确的位置,算法就不必对很多元素进行交换。
    * 这就是希尔排序比插入排序更高效的地方。
    * */
    function shellSort() {
        console.log("排序前"+":  "+myNums.toString());
        for(var g = 0; g < this.gaps.length; ++g) {
            for(var i = this.gaps[g]; i < this.dataStore.length; ++i) {
                var temp = this.dataStore[i];
                for(var j = i; j >= this.gaps[g] && this.dataStore[j - this.gaps[g]] > temp; j -= this.gaps[g]) {
                    this.dataStore[j] = this.dataStore[j - this.gaps[g]];
                }
                this.dataStore[j] = temp;
    //            console.log(g+"--"+i+":  "+myNums.toString());
            }
            console.log(g+":  "+myNums.toString());
        }
    
    }
    
    
    // 希尔排序测试代码
    var numElements = [0,9,1,8,7,6,2,3,5,4];
    var gaps = [3,2,1];
    var myNums = new CArray(numElements,gaps);
    myNums.shellSort();
    console.log("排序后"+":  "+myNums.toString());
  • 相关阅读:
    java源码ReentrantLock源码分析1
    java源码Semaphore源码分析
    java源码HashMap源码分析
    java源码LinkedHashMap类设计
    java源码HashMap类设计
    java源码ConcurrentHashMap分析1
    java源码CountDownLatch源码分析
    转linux误删文件恢复 简单
    「翻译」Redis协议 简单
    刘昕明:送给和我一样曾经浮躁过的PHP程序员 简单
  • 原文地址:https://www.cnblogs.com/baiyangyuanzi/p/6708998.html
Copyright © 2011-2022 走看看