算法学习:O(n^2)排序算法

Posted ling-diary

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习: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)希尔排序最关键是理解它是步长衰减的插入排序。

 

以上是关于算法学习:O(n^2)排序算法的主要内容,如果未能解决你的问题,请参考以下文章

算法 | Java 常见排序算法(纯代码)

以下代码片段的算法复杂度

经典排序算法学习笔记五——直接选择排序

Java学习笔记——排序算法之O(n²)排序

经典排序算法学习笔记3——插入排序

经典排序算法学习笔记四——希尔排序