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)希尔排序最关键是理解它是步长衰减的插入排序。

  • 相关阅读:
    c标签页面进行解析json
    Android 简述touch事件中的MotionEvent
    R中读取文件,找不到路径问题 No such file or directory
    文章标题
    Codeforces Beta Round #2 C. Commentator problem
    openfire 开发遇到的些问题
    BZOJ 刷题记录 PART 5
    公司又裁人了……
    最简单的基于FFmpeg的移动端样例:Android 视频转码器
    单片机: 简易计算器的实现(键盘)
  • 原文地址:https://www.cnblogs.com/ling-diary/p/9300961.html
Copyright © 2011-2022 走看看