美文网首页程序员
数据结构之排序算法

数据结构之排序算法

作者: 神秘者007 | 来源:发表于2018-04-19 15:18 被阅读38次
    image.png
    image.png
    image.png
    image.png

    冒泡排序

      //  测试用例类
            var CArray = function(){
                this.dataStore = [10,8,3,2,9,1];
                this.swap = swap;
                this.bubbleSort = bubbleSort;
            }
    
            //  交换方法
            function swap(arr,index1,index2){
                var temp = arr[index1];
                arr[index1] = arr[index2];
                arr[index2] = temp;
            }
            
            //  冒泡排序
            function bubbleSort() {
                var data = this.dataStore;
                numEle = data.length;
                for(var outer=numEle;outer>=2;--outer){
                    for(var inner=0;inner<=outer-1;inner++){
                        if(data[inner]>data[inner+1]){
                            this.swap(this.dataStore,inner,inner+1)
                        }
                    }
                }
            }
    
            var mynums = new CArray();
            mynums.bubbleSort(mynums);
            console.log(mynums.dataStore);
    

    选择排序

    image.png
    //  测试用例类
        var CArray = function () {
            this.dataStore = [1,8,3,2,9,5,4,7];
            this.swap = swap;
            this.selectSort = selectSort;
        }
    
        //  交换方法
        function swap(arr,index1,index2){
            var temp = arr[index1];
            arr[index1] = arr[index2];
            arr[index2] = temp;
        }
        
        //  选择排序方法
        function selectSort() {
            var min;                             //  注意
            for(var outer = 0;outer<=this.dataStore.length-2;outer++){
                min = outer;
                for(var inner=outer+1;inner<this.dataStore.length;inner++){
                    if(this.dataStore[inner]<this.dataStore[min]){
                        min = inner;
                    }
                }
                //  找到最小值,进行交换
                this.swap(this.dataStore,outer,min);
            }
        }
        
        var mynums = new CArray();
        mynums.selectSort();
        console.log(mynums.dataStore);
    

    插入排序

    //  测试用例类
        var CArray = function () {
            this.dataStore = [1,8,3,2,9,5,4,7]
            this.insertSort = insertSort;
        }
        
        //  插入排序方法
        function insertSort() {
            var temp,inner;
            for(var outer=1;outer<this.dataStore.length;++outer){
                temp = this.dataStore[outer];
                inner = outer;
                while(inner>0&&(this.dataStore[inner-1]>=temp)){
                    //  往后移动位置,让小元素移动到前面去
                    this.dataStore[inner] = this.dataStore[inner-1];
                    console.log('内部元素',this.dataStore);
                    inner--;
                }
                this.dataStore[inner] = temp;  // 插入小元素
                console.log('插入后的结果',this.dataStore);
            }
        }
    
        var mynums = new CArray();
        mynums.insertSort();
        console.log(mynums.dataStore);
    结果:
    
    image.png

    希尔排序

    希尔排序是基于插入排序改进的,需要定间隔来进行每一次的排序


    image.png
     //  测试用例类
            var CArray = function () {
                this.dataStore = [10,8,3,2,5,9,4,7,35,48,20];
                this.gaps = [5,3,1];  //  排序的间隔序列
                this.shellSort = shellSort;  //  静态希尔排序方法,间隔值是定死的
                this.swap = swap;  //  交换方法
                this.dynamiSort = dynamiSort  // 动态改变间隔值的希尔排序
            }
    
            //  交换方法
            function swap(arr,index1,index2){
                var temp = arr[index1];
                arr[index1] = arr[index2];
                arr[index2] = temp;
            }
    
            //  希尔排序
            function shellSort() {
                //  循环间隔序列
                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('输出间隔调换后的序列',this.dataStore);
                }
            }
    
            //  动态改变间隔值的希尔排序
            function dynamiSort() {
                var N = this.dataStore.length;
                var h = 1;
                while(h<N/3){
                    h=3*h+1
                }
                while(h>=1){
                    for(var i=h;i<N;i++){
                        for(var j=i;j>=h&&this.dataStore[j]<this.dataStore[j-h];j=j-h){
                            this.swap(this.dataStore,j,j-h);
                        }
                    }
                   h = (h-1)/3;
                }
            }
    
            var mynums = new CArray();
            mynums.dynamiSort();
          //  console.log(mynums.dataStore);
            console.log('动态希尔排序',mynums.dataStore);
    

    归并排序

     //  归并排序
        function mergeSort(arr) {
            if(arr.length<2){
                return ;
            }
            var step = 1;
            var left,right;
            while(step<arr.length){
                left = 0;
                right = step;
                while(right+step<=arr.length){
                    mergeArrays(arr,left,left+step,right,right+step);
                    left = right+step;
                    right = left+step;
                }
                if(right<arr.length){
                    mergeArrays(arr,left,left+step,right,arr.length);
                }
                step*=2;
            }
        }
    
        //  合并数组方法
        function mergeArrays(arr, startLeft, stopLeft, startRight, stopRight) {
            var rightArr = new Array(stopRight-startRight+1);
            var leftArr = new Array(stopLeft-startLeft+1);
    
            k=startRight;
            for(var i=0;i<(rightArr.length-1);i++){
                rightArr[i] = arr[k];  //  拿到右数组
                ++k;
            }
    
            k=startLeft;
            for(var i=0;i<(leftArr.length-1);i++){
                leftArr[i] = arr[k];  //  拿到左数组
                ++k;
            }
    
            rightArr[rightArr.length-1] = Infinity;
            leftArr[leftArr.length-1] = Infinity;
    
            var m = 0; //  左数组开始位置
            var n = 0; //  右数组的开始位置
            for(var k=startLeft;k<stopRight;k++){
                if(leftArr[m]<=rightArr[n]){
                    arr[k] = leftArr[m];
                    m++;
                }else{
                    arr[k] = rightArr[n];
                    n++;
                }
            }
        }
    
    
        var arr = [23,45,19,98,32,67,12,3,9];
        mergeSort(arr);
        console.log(arr);
    

    快速排序(重点)

     //  快速排序
        function qSort(list) {
            if(list.length==0){
                return [];
            }
            var pivot = list[0]; //  基准值
            var lesser = [];  //  小于的基准值
            var greater = [];  //  大于的基准值
            for(var i=1;i<list.length;i++){
                if(list[i]<pivot){
                    lesser.push(list[i]);
                }else{
                    greater.push(list[i]);
                }
            }
            return qSort(lesser).concat(pivot,qSort(greater));  //  不断的迭代
        }
    
        var data = [44,75,23,43,55,12,64,77,33];
        console.log(qSort(data));
    

    基准值:44当前元素:75
    移动75到右边
    基准值:44当前元素:23
    移动23到左边
    基准值:44当前元素:43
    移动43到左边
    基准值:44当前元素:55
    移动55到右边
    基准值:44当前元素:12
    移动12到左边
    基准值:44当前元素:64
    移动64到右边
    基准值:44当前元素:77
    移动77到右边
    基准值:44当前元素:33
    移动33到左边
    基准值:23当前元素:43
    移动43到右边
    基准值:23当前元素:12
    移动12到左边
    基准值:23当前元素:33
    移动33到右边
    基准值:43当前元素:33
    移动33到左边
    基准值:75当前元素:55
    移动55到左边
    基准值:75当前元素:64
    移动64到左边
    基准值:75当前元素:77
    移动77到右边
    基准值:55当前元素:64
    移动64到右边
    [ 12, 23, 33, 43, 44, 55, 64, 75, 77 ]

    相关文章

      网友评论

        本文标题:数据结构之排序算法

        本文链接:https://www.haomeiwen.com/subject/pbwzhftx.html