标签:排序算法
冒泡排序经典的排序算法,实现的思想是通过两两相邻的元素比较,使较大的数字不断向队列上部浮动,就如同水里的一个气泡一般不断向上浮,所以才得到一个"冒泡排序"好听的名字。
那接下来我通过一个小例子来看看冒泡排序的实现:
[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)
本文出自 “11768293” 博客,请务必保留此出处http://11778293.blog.51cto.com/11768293/1839886
标签:排序算法
原文地址:http://11778293.blog.51cto.com/11768293/1839886