js 数组冒泡排序


一. 算法逻辑(以升序排列为例)
(1). 从第一项开始, 依次与数组中所有项(包括它自己)逐个进行比较, 如果当前项(当前项是每次比较之后的最大值)大于下一项, 则交换两者的位置;
(2). 每一轮比较完成之后, 最大值都会被放在合适的位置:
a. 第一轮比较完成时, 最大值成为数组的最后一项;
b. 第二轮比较完成时(第二轮比较会将数组最后一项排除在外), 第二大的值会成为数组的倒数第二项;
c. 第三轮比较完成时(第三轮比较会将数组最后两项排除在外), 第三大的值会成为数组的倒数第三项;
...
二. code
function sortMethod(arr) {
// 交换两个数组项的位置
var swap = function(firstIndex, secondIndex) {
var temp = arr[firstIndex];
arr[firstIndex] = arr[secondIndex];
arr[secondIndex] = temp;
};

// 升序排列
var bubbleSort = function() {
var i, j, stop, len = arr.length;
for (i=0; i<len; i=i+1) {
for (j=0, stop = len - i; j<stop; j=j+1) {
// 将这里的'>'换成'<'即为降序排列
if (arr[j] > arr[j+1]) { swap(j, j+1); }
}
}
}();
}
三. 该算法的运算次数
假设n为数组的长度, 则对该数组进行冒泡排序的运算次数为: Sum(n) = (n2 + 3n) / 2

 

=================================================================

=================================================================

=================================================================

 

var a = [0,6,3,2,11,99,55];
for(var i=0;i<a.length-1;i++){
for(var j=i+1;j<a.length;j++){
if(a[i] > a[j]){
var temp = a[i];
a[i] = a[j];
a[j] = temp
}
}
}
alert(a);

 

=================================================================

=================================================================

=================================================================

 

冒泡排序是交换排序中最基本的一种方法。

冒泡排序算法思想
要排序的数组是个水缸,数组里的每个数字都是一个气泡。将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。

第一趟扫描
从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n- 1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换 R[j+1]和R[j]的内容。第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。
第二趟扫描
扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上…… 最后,经过n-1趟扫描可得到有序区R[1..n]。
注意
 第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置R[i]上,结果是R[1..i]变为新的有序区。

扩展
 因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。
Flash动画演示冒泡算法原理
点击查看Flash动画

Javascript实现的冒泡排序算法

PLAIN TEXT
JAVASCRIPT:
//需要排序的数组
var list = Array(23, 45, 18, 37, 92, 13, 24);
//数组长度
var n = list.length;
//交换顺序的临时变量
var tmp;//
//交换标志
var exchange;
//最多做n-1趟排序
for (var time = 0; time <n - 1; time ++) {
exchange = false;
for (var i = n - 1; i> time; i–-) {
if (list[i] <list[i - 1]) {
exchange = true;
tmp = list[i - 1];
list[i - 1] = list[i];
list[i] = tmp;
}
}
//若本趟排序未发生交换,提前终止算法
if (!exchange) {
break;
}
}
alert(‘数组排序后为:’ + list + ‘,n共排了’ + time + ‘趟’);

posted @ 2013-08-28 15:45  竹三戒  阅读(694)  评论(0编辑  收藏  举报