---恢复内容开始---

排序就是让数据按其关键字的某种次序排列起来,有一定的顺序这样方便于查找 是数据处理的重要操作而且方法很多应用广泛

排序又分为内排序和外排序

内排序:整张表放在内存当中处理 适合小表

外排序:排序过程需要内外表交换 适合于个数多不能一次放入内存处理的大表 内排序是外排序的基础

 

内排序又分为基于比较的排序(插入排序、交换排序、选择排序、归并排序)和非基于比较的排序(基数排序)

 

基于比较的排序新能由比较和交换的次数之和决定 如果要排序的关键字的顺序正好和要排序的顺序相同则称为正序否则为反序

内排序的是否稳定与排序后某些数据的相对序数是否仍然保持不变

---恢复内容结束---

排序就是让数据按其关键字的某种次序排列起来,有一定的顺序这样方便于查找 是数据处理的重要操作而且方法很多应用广泛

排序又分为内排序和外排序

内排序:整张表放在内存当中处理 适合小表

外排序:排序过程需要内外表交换 适合于个数多不能一次放入内存处理的大表 内排序是外排序的基础

 

内排序又分为基于比较的排序(插入排序、交换排序、选择排序、归并排序)和非基于比较的排序(基数排序)

 

基于比较的排序新能由比较和交换的次数之和决定 如果要排序的关键字的顺序正好和要排序的顺序相同则称为正序否则为反序

内排序的是否稳定与排序后某些数据的相对序数是否仍然保持不变

    (function(Array){
        function Node(key,data){
            this.key = key;
            this.data = data;
        };
        Array.prototype.MiSort=function(){
        
        var i=1;//从第一个开始排序
        var temp = null;//用于保存要交换的值
        var j=0;
        var obj =null;
        for(var i = 1;i<this.length;i++){
            //如果有序区的最后的一个元素值大于无序区第一个值则进入排序
            if(this[i-1].key>this[i].key){
                //保存无序区第一个值防止后边覆盖
                temp = this[i].key;//
                obj = this[i];
                //开始将有序区中比temp大的元素后移一位
                j = i-1;
                //但元素值大于temp且还么到达负数的情况下进行移动
                while(j!=-1&&temp<this[j].key){
                    this[j+1] = this[j];
                    j--;//知道this[j]<=temp停止

                }
                this[j+1] = obj;

            }
        }
    }
    Array.prototype.createS = function(arr){
        for(var i=0;i<arr.length;i++){
            //当前的对象上添加数据
            this.push(new Node(arr[i],i));
        }
    }
})(Array);
    var arr = [12,32,11,3,65,100,4,7,9];//需要排序的数据
    var stack = [];//用于创建结点的数组
    //创建顺序表
    stack.createS(arr);
    //开始排序
    stack.MiSort();
    //打印结果
    console.log(stack);

 

 算法分析:

有该算法可以看出有内外循环 内循环只有插入的元素的值小于有序区的元素情况下这才进行循环 最好的情况下就是插入元的元素刚好大于有序区最大元素 而且待插入区元素为有序的

时间复杂度为 n-1次比较 0次插入 所以为O(n)

 

最坏情况下就是: 每次插入都需要移动 i个元素而且进行 i+2次比较 时间复杂度为O(n^2)

 

 

折半插入排序

    /*折半排序*/
    Array.prototype.centerSort = function(){
        var low,height,obj,data,mid;
        for(var i=1;i<this.length;i++){
            //先用有序区的最后一个元素与无序区的第一个元素比较如果前者大于后者则进入折半插入当中
            if(this[i-1].key>this[i].key){
                //先保存下位置信息
                low = 0;
                height = i-1;
                obj = this[i];
                data = this[i].key;//保存下这个无序区的数据在后边方便判断
                /*
                这里可能遇到的情况
                3插入位置4 m=3 当
                this[3]>data; 此时height = 2 或者 this[3]>data; 此时height = 2 
                3插入位置3 m=3 当  
                this[3]>data; 此时height = 2 或者 this[3]>data; 此时height = 2 
                也就是说当low = height 或者low 和height 差1 的时候 m取最小的那个数
                low = m+1或者height = m-1最终都导致 low == height  此时的this[m].key 应该是小于或者大于等于data;
                最后如果小于 说明data在右半区 low = m+1  
                应该将height+1(也就是m+1)开始的元素后移一位 应该将数据放在this[height+1]处

                最后如果大于 说明data在左半区 height = m-1  应该将height+1(也就是m)开始的元素后移一位 应该将数据放在this[height+1]处

                 */
                while(low<=height){
                    mid = Math.floor((low+height)/2);//向下取整
                    if(this[mid].key>data){//左半区
                        height=mid-1;
                    }else{
                        low = mid+1;
                    }
                }
                //找到位置后将数据往后移动
                for(var j = i-1;j>=height+1;j--){//将i-1 到height+1的元素均后移一位
                    this[j+1] = this[j];
                }
                this[height+1] = obj;
            }
        }
    };

 

posted on 2019-09-01 07:27  渐凸强、啊哈  阅读(166)  评论(0编辑  收藏  举报