冒泡排序
思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。
冒泡排序的算法原理(從後往前):
-
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
-
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
-
針對所有的元素重複以上的步驟,除了最後一個。
-
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
//冒泡排序
/*
思路分析:
第一輪 第一步:[23,34,12,5,22,11]
第一輪 第二步:[23,12,34,5,22,11]
第一輪 第三步:[23,12,5,34,22,11]
第一輪 第四步:[23,12,5,22,34,11]
第一輪 第五步:[23,12,5,22,11,34]
第二輪 第一步:[12,23,5,22,11,34]
第二輪 第二步:[12,5,23,22,11,34]
第二輪 第三步:[12,5,22,23,11,34]
第二輪 第四步:[12,5,22,11,23,34]
第三輪 第一步:[5,12,22,11,23,34]
第三輪 第二步:[5,12,22,11,23,34]
第三輪 第三步:[5,12,11,22,23,34]
第四輪 第一步:[5,11,12,22,23,34]
*/
function bubbleSort (arr) {
// 控制冒泡的次數
for (var i = 1;i<arr.length;i++) {
// 控制每輪冒出一個數需要比較的次數
for (var j = 0; j < arr.length-i; j++) {
if (arr[j] > arr[j+1]) {//判斷是否交換下標
var temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr;
}
//調用:
var arr = [23,34,12,5,22,11];
console.log(bubbleSort(arr));
選擇排序
思路分析:選擇排序和冒泡排序的思路類似,也是依次相鄰的數進行兩兩比較,不同之處在於,他不是每一次比較就進行交換位置,而是一輪比較完畢,找到最大值或者最小值之後,將其放在合適的位置,其他數的位置不變,先假設下標爲0的數是最大數或者最小數,將數組遍歷一遍,尋找是否存在比假設的這個數還要大或者還要小的數,如果有,交換位置,如果沒有,不交換位置,然後下標自增,繼續循環之前的程序
/*
選擇排序的思路分析:
第1輪 第1步:var iMinK = 0;
第1輪 第2步:23 和 34比較,什麼也不做
第1輪 第3步:23 和 11比較,iMinK = 2
第1輪 第4步:11 和 22比較,什麼也不做
第1輪 第5步:11 和 19比較,什麼也不做
第1輪 第6步:11 和 18比較,什麼也不做
第1輪 第7步:下標0和下標2進行位置交換 [11, 34, 23, 22, 19, 18]
第2輪 第1步:var iMinK = 1;
第2輪 第2步:34 和 23比較,iMinK = 2
第2輪 第3步:23 和 22比較,iMinK = 3
第2輪 第4步:22 和 19比較,iMinK = 4
第2輪 第5步:19 和 18比較,iMinK = 5
第2輪 第6步:下標1和下標5進行位置交換 [11, 18, 23, 22, 19, 34]
*/
// 外層for循環確定輪數
var arr = [23, 34, 11, 22, 19, 18];
for(var i = 0; i < arr.length - 1; i++) {
// 記錄最小值的下標
var iMinK = i;
for(var j = i + 1; j < arr.length; j++) {
if(arr[iMinK] > arr[j]) {
iMinK = j;
}
}
// 交換數據
if(iMinK !== i) {
var temp = arr[i];
arr[i] = arr[iMinK];
arr[iMinK] = temp;
}
}
console.log(arr);
冒泡排序法和選擇排序法的異同點:
冒泡算法,每次比較如果發現較小的元素在後面,就交換兩個相鄰的元素。而選擇排序算法的改進在於:先並不急於調換位置,先從arr[0]開始逐個檢查,看哪個數最小就記下該數所在的位置max,等一躺掃描完畢,再把arr[max]和arr[0]對調,這時arr[0]到arr[i]中最小的數據就換到了最前面的位置。
所以,選擇排序每掃描一遍數組,只需要一次真正的交換,而冒泡可能需要很多次。比較的次數是一樣的。
插入排序
思路分析:先把arr[1]對應的數字拿出來作爲將要插入的數,和原數組的比他下標小的數做比較,如果滿足條件,交換位置,否則原封不動,然後後幾輪循環前面的步驟,最後輸出這個數組。代碼如下:
/*
插入排序的思路分析:
第1輪 第1步:var arr = [23,34,12,5,22,18,11];//34作爲待插入數和23比較不交換位置
第2輪 第1步:var arr = [23,12,34,5,22,18,11];//12作爲待插入數和34比較交換位置
第2輪 第2步:var arr = [12,23,34,5,22,18,11];//12作爲待插入數和23比較交換位置
第3輪 第1步:var arr = [12,23,5,34,22,18,11];//5作爲待插入數和34比較交換位置
第3輪 第2步:var arr = [12,5,23,34,22,18,11];//5作爲待插入數和23比較交換位置
第3輪 第3步:var arr = [5,12,23,34,22,18,11];//5作爲待插入數和12比較交換位置
第4輪 第1步:var arr = [5,12,23,22,34,18,11];//22作爲待插入數和34比較交換位置
第4輪 第2步:var arr = [5,12,22,23,34,18,11];//22作爲待插入數和23比較交換位置
第4輪 第3步:var arr = [5,12,22,23,34,18,11];//22作爲待插入數和12比較不交換位置
第4輪 第4步:var arr = [5,12,22,23,34,18,11];//22作爲待插入數和5比較不交換位置
第5輪 第1步:var arr = [5,12,22,23,18,34,11];//18作爲待插入數和34比較交換位置
第5輪 第2步:var arr = [5,12,22,18,23,34,11];//18作爲待插入數和23比較交換位置
第5輪 第3步:var arr = [5,12,18,22,23,34,11];//18作爲待插入數和22比較交換位置
第5輪 第4步:var arr = [5,12,18,22,23,34,11];//18作爲待插入數和12比較不交換位置
第5輪 第5步:var arr = [5,12,18,22,23,34,11];//18作爲待插入數和5比較不交換位置
第6輪 第1步:var arr = [5,12,18,22,23,11,34];//11作爲待插入數和34比較交換位置
第6輪 第2步:var arr = [5,12,18,22,11,23,34];//11作爲待插入數和23比較交換位置
第6輪 第3步:var arr = [5,12,18,11,22,23,34];//11作爲待插入數和22比較交換位置
第6輪 第4步:var arr = [5,12,11,18,22,23,34];//11作爲待插入數和18比較交換位置
第6輪 第5步:var arr = [5,11,12,18,22,23,34];//11作爲待插入數和12比較交換位置
第6輪 第6步:var arr = [5,11,12,18,22,23,34];//11作爲待插入數和5比較不交換位置
*/
//外層循環確定輪次數
var arr = [23,34,12,5,22,18,11];
for(var i = 1;i < arr.length;i++){
//內層的for循環
for(var j = i ; j > 0; j--){
if(arr[j] < arr[j-1]){
var temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}else{
break;
}
}
}
console.log(arr);
快速排序法
思路分析:
1、先從數列中取出一個數作爲基準數
2、分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊
3、再對左右區間重複第二步,直到各區間只有一個數
var arr = [21,32,43,81,54,45,23];
function quickSort(arr) {
if(arr.length <= 1) {
return arr;
}
var iBase = arr.shift();
var left = [], right = [];
for(var i = 0; i < arr.length; i++) {
if(arr[i] < iBase) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat(iBase, quickSort(right));
}
var newArr = quickSort(arr);
console.log(newArr);
以上四種是比較常見的四種排序方式,在編程語言中還存在其他的排序方式,感興趣的同學可以自行百度