常見的四種排序方法

冒泡排序

思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。

冒泡排序的算法原理(從後往前):
  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對所有的元素重複以上的步驟,除了最後一個。
  4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。

//冒泡排序
/*
	思路分析:
	第一輪 第一步:[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);
以上四種是比較常見的四種排序方式,在編程語言中還存在其他的排序方式,感興趣的同學可以自行百度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章