zoukankan      html  css  js  c++  java
  • 算法学习(二):O(n^2)排序算法

    总结一下学习的复杂度为O(n^2)的三种排序算法:选择排序,插入排序,希尔排序。

    (1)选择排序:从第一个位置开始每次查找剩下的位置中最小的数值放入当前位置;

    (2)插入排序:从第二个位置开始,每次都将当前位置的数值插入前面合适的位置,对于几乎有序的数列来说,插入排序能带来更高的效率;

    (3)希尔排序:变步长区间的插入排序,指定一个步长衰减率,每一轮插入排序都将间隔指定步长的数值排序完成,当步长衰减为1时,就成了标准的插入排序。

    代码实现:

    (1)选择排序

    var selectSort = function(arr,len){
        var i,j,min;
        for(i = 0; i < len; ++i){
            min = i;
            for(j = i + 1; j < len; ++j){
                if(arr[min] > arr[j]){
                    min = j;
                }
            }
            swap(arr,i,min);
        }
    };

    (2)插入排序

    var insertSort = function(arr,len){
        var i,j,k;
        for(i = 1; i < len; ++i){
            k = i;
            for(j = i-1; j >= 0; --j){
                if(arr[j] > arr[k]){
                    swap(arr,k,j);
                    k--;
                }else{
                    break;
                }
            }
        }
    };

    (3)希尔排序

    var shellSort = function(arr,len,stepInterval){
        var step,i,j,k;
        for(step = Math.floor(len / stepInterval); step > 0; step = Math.floor(step/stepInterval)){
            for(i = step; i < len; ++i){
                k = i;
                for(j = i - step; j >= 0 && arr[j] > arr[k]; j -= step){
                    swap(arr,k,j);
                    k = j;
                }
            }
        }
    }

    总结:

    (1)可以从整理扑克牌的不同方式来帮助理解,选择排序就是每次都从剩下的牌里取最小的牌放到手里最后的位置;插入排序就是每次都将剩下的牌里任取的一张插入手中牌里合适的位置;

    (2)希尔排序最关键是理解它是步长衰减的插入排序。

  • 相关阅读:
    租户功能
    async await
    IOptions and context
    Setting Management: 用于持久化设置Setting值
    设置模块
    vs2017单元测试没反应,检测出错误,有关详细信息,请查看“测试输出”窗口
    自定义JS组件+调用restfui接口显示(SpringBoot)
    flex布局采用justify-content:space-between时,当为两个内容时中间被空出的解决方案
    CSS3 边框彩虹跑马灯
    react native 调试时,调出DEV菜单
  • 原文地址:https://www.cnblogs.com/ling-diary/p/9300961.html
Copyright © 2011-2022 走看看