数据结构之排序算法

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 ]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 1. 冒泡排序 基本思想:每次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。 时间复杂度: 最好的情况下...
    Mr希灵阅读 515评论 0 5
  • 因为之前就复习完数据结构了,所以为了保持记忆,整理了一份复习纲要,复习的时候可以看着纲要想具体内容。 树 树的基本...
    牛富贵儿阅读 6,765评论 3 10
  • 查找和排序都是程序设计中经常用到的算法。查找相对而言较为简单,不外乎顺序查找、二分查找、哈希表查找和二叉排序树查找...
    eagleRock阅读 5,561评论 0 14
  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 12,177评论 6 19
  • 逃避是解决不了问题的。无论你多不想面对他,多不想设想那最坏的结局。但凡你不迎难而上,事情便不会有转机,坏的结局也依...
    莫取阅读 412评论 0 0