排序算法之冒泡排序

冒泡排序经典的排序算法,实现的思想是经过两两相邻的元素比较,使较大的数字不断向队列上部浮动,就如同水里的一个气泡通常不断向上浮,因此才获得一个"冒泡排序"好听的名字。javascript

wKioL1e1LP2hXdsiAACp2m90VC4671.png-wh_50图片转载css


那接下来我经过一个小例子来看看冒泡排序的实现:
html

[7,4,1,8,2]

上面的数组实现从小到大排序。java

由于冒泡排序是两两相邻比较,因此
算法

step1 
  7与4比较,7>4,交换位置后得数组:[4,7,1,8,2]
  
step2
  7与1比较,7>1,交换位置后得数组:[4,1,7,8,2]
  
step3
  7与8比较,7<8,不进行交换得数组:[4,1,7,8,2] 
  
step4
  8与2比较,8>2,交换位置后得数组:[4,1,7,2,8]

至此第一轮冒泡结束,咱们看到数组中元素最大的8已经到了最后,这就是通过一轮冒泡,最大的元素已经浮动到最上面。以后只要重复这4个步骤就能够了。数组

可是这个没经优化的冒泡排序的时间复杂度是O(N2)。ide


优化的思想就是:若是数组中某个元素到最后一个元素是已经排好序的,那么这段数据就不须要进行比较并排序了。优化

[2,1,4,5,6,7,8]

像这个数组中,[4,5,6,7,8]是已经排好序的,只须要排[2,1]就ok。spa


代码以下:orm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>冒泡排序</title>
    <script type="text/javascript">
        function myclick(){
            var value = document.getElementById("sort_array").value;
            var array = value.split(",");
            document.getElementById("echo_array").value = mysort(array).toString();

        }
        //排序算法
        function mysort(arr){
            var i,flag = 1,temp,j=arr.length;
            while(flag){

                flag = 0;//每次数组的循环以前置为0
                for(i=1;i<j;i++){
                    if(parseInt(arr[i])>parseInt(arr[i-1])){
                        temp = arr[i];
                        arr[i] = arr[i-1];
                        arr[i-1] = temp;
                        flag = 1;//标志位,若是有交换则置为1

                    }
                }
                j = i;//记录最后一次交换的数组下标
            }
            return arr;
        }
    </script>
    <style type="text/css">
        input{
            width: 300px;
        }
    </style>
</head>
<body>
    <label>请输入待排序的数字,用逗号隔开:</label><input type="text" id="sort_array"/>
    <label>请输入待排序的数字,用逗号隔开:</label><input type="text" id="echo_array"/>
    <input type="button" value="排序" onclick="myclick()"/>
</body>
</html>

这样通过优化过的算法最好的时间复杂度是O(n),最坏的状况下仍是O(N2)

相关文章
相关标签/搜索