1.冒泡排序
思想:
第一趟:相鄰兩個(gè)位置上的數(shù)進(jìn)行比較,大的排后面(或者前面)获询,進(jìn)行交換順序涨岁,繼續(xù)和下一個(gè)數(shù)進(jìn)行比較拐袜,這樣找到最大(最小)的數(shù)字梢薪。
第二趟:相同的規(guī)則阻肿,找到第二大(小)的數(shù)沮尿,
...
<code>
//冒泡排序算法
var array = [23,546,57,34,7869,1324];
*原始排序(不將比較后的數(shù)挑選出來(lái),只是排到后面) ------
// 控制趟數(shù)
var s = 0; //記錄循環(huán)此次
for(var i = 0; i <array.length - 1; i++){
// 控制兩兩比較的次數(shù)
for(var j = 0; j < array.length - 1; j++){
if(array[j] > array[j+1]){
var temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
s++;
}
}
console.log('s',s); // 比較次數(shù)最多25次 (數(shù)字長(zhǎng)度減1的平方)
console.log('array',array);
</code>
*內(nèi)循環(huán)可以減少比較次數(shù):(將比較后的數(shù)挑選出來(lái)较解,在剩下的數(shù)里面按照上面的規(guī)則找到剩下最大的數(shù))
<code>
//冒泡排序算法
var array = [23,546,57,34,7869,1324];
// 控制趟數(shù)
var s = 0; //記錄循環(huán)此次
for(var i = 0; i <array.length - 1; i++){
// 控制兩兩比較的次數(shù)
for(var j = 0; j < array.length - 1 - i ; j++){
if(array[j] > array[j+1]){
var temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
s++;
}
}
console.log('s',s); // 比較次數(shù) 15次
console.log('array',array);
</code>
*檢測(cè)某一趟是否需要交換位置畜疾。
(如果檢測(cè)到跑一趟后,兩兩數(shù)沒(méi)有再交換順序了印衔,則說(shuō)明已經(jīng)排序好了啡捶,不需要再循環(huán)了)
<code>
//冒泡排序算法
var array = [23,546,57,34,7869,1324];
// 控制趟數(shù)
var s = 0; //記錄循環(huán)此次
for(var i = 0; i <array.length - 1; i++){
// 控制兩兩比較的次數(shù)
var isSort = true; //每一趟開(kāi)始前,先假設(shè)就已經(jīng)排好了
for(var j = 0; j < array.length - 1 - i ; j++){
if(array[j] > array[j+1]){
isSort = false; //說(shuō)明這一趟中還存在交換位置奸焙,還沒(méi)有拍好瞎暑,給isSort = false;
var temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
s++;
}
if(isSort ){
break;//如果有一趟存在沒(méi)有再交換位置了,說(shuō)明已經(jīng)排好了与帆,沒(méi)有再進(jìn)行下一輪比較的必要了了赌,跳出外層循環(huán)
}
}
console.log('s',s); // 12 . 比較次數(shù)最少,不定次數(shù)玄糟,至少要交5次勿她。根據(jù)原始數(shù)組的順序。阵翎。
console.log('array',array);
</code>