三大经典排序

来源:互联网 发布:淘宝店铺装修招牌图片 编辑:程序博客网 时间:2024/05/02 01:04

今天突然发现对排序有点不熟悉,便总结了一些对三大排序的理解,可能只是片面的,欢迎大家斧正 >_<
以下三大排序皆为从小到大排序
以数组a=[6, 5, 3, 1, 8, 7, 2, 4]为对象。
排序后a=[1,2,3,4,5,6,7,8]

冒泡排序

基本思想:两个数比较大小,较大的数下沉,较小的数冒起来。
过程:
1、比较相邻的两个数据,如果第二个数小,就交换位置。
2、从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。
3、继续重复上述过程,依次将第2.3…n-1个最小数排好位置。

        for(var i = 0;i < a.length-1 ;i++){            for(var j= a.length-1;j > i ;j--){                if(a[j] < a[j-1]){                    var t = a[j];                    a[j] = a[j-1];                    a[j-1] = t;                }            }        }

优化冒泡算法

针对问题:数据排好后,仍进行循环。
解决方案:立个flag标志,如果发生交换则设置为true,否则设置为false

     for(var i = 0;i < a.length-1 ;i++){            var flag = false ;            for(var j= a.length-1;j > i ;j--){                if(a[j] < a[j-1]){                    var t = a[j];                    a[j] = a[j-1];                    a[j-1] = t;                    flag = true ;                }            }            if(!flag) break;        }

选择排序

基本思想:每遍历一次都记住了当前最小元素的位置,最后仅需一次交换操作即可将其放到合适的位置。
过程:
1、在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;
2、第二次遍历n-2个数,找到最小的数值与第二个元素交换;
3、第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。

       for(var i = 0;i < a.length-1;i++){            var min = i;            for(var j = i+1; j< a.length ;j++){                if(a[j]<a[min]){                   min=j;                }            }            if(min != i){                var t = a[i];                a[i] = a[min];                a[min] = t;            }        }

插入排序

基本思想:对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
过程:
1、假定前n-1个数已经排好序
2、将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。
3、反复循环,直到全部排好顺序。

    for(var i = 1;i < a.length;i ++){        var temp = a[i];        for(var j=i - 1; j >= 0 && a[j] >temp;j --){            a[j+1] = a[j];        }        a[j+1] = temp;    }
原创粉丝点击