您的位置:首页 > 其它

排序算法之冒泡排序

2016-08-18 11:58 204 查看
冒泡排序经典的排序算法,实现的思想是通过两两相邻的元素比较,使较大的数字不断向队列上部浮动,就如同水里的一个气泡一般不断向上浮,所以才得到一个"冒泡排序"好听的名字。


图片转载

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

[7,4,1,8,2]
上面的数组实现从小到大排序。
因为冒泡排序是两两相邻比较,所以

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)。

优化的思想就是:如果数组中某个元素到最后一个元素是已经排好序的,那么这段数据就不需要进行比较并排序了。
[2,1,4,5,6,7,8]
像这个数组中,[4,5,6,7,8]是已经排好序的,只需要排[2,1]就ok。

代码如下:
<!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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序算法