【冒泡排序】原理:
針對所有的元素重複以上的步驟, 除了最後一個。
持續每次對越來越少的元素重複上面的步驟, 直到沒有任何一對數字需要比較。
比較相鄰的元素。 如果第一個比第二個大, 就交換他們兩個。
對每一對相鄰元素做同樣的工作, 從開始第一對到結尾的最後一對, 在這一點, 最後的元素應該會是最大的數。
var arr = [12, 3, 569, 78, 0, -56, 1223, 11, 16, 13, 1, 12];
function bubbleSort(arr) {
if (Array.isArray(arr)) { //是數組
for (var i = 0; i < arr.length - 1; i++) { //控制輪數 -1:12個數字只需要比較11輪
for (var j = 0; j < arr.length - i - 1; j++) { //第i輪,表示已經排序好i個數字。 -1:12個數字兩兩比較11次。
if (arr[j] > arr[j + 1]) { //比較相鄰的元素。 如果第一個比第二個大, 就交換他們兩個
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
} else { //不是數組
throw new Error('請輸入數組'); //新建錯誤對象,包含錯誤信息,拋出錯誤 throw
}
}
console.log(bubbleSort(arr))
【選擇排序】原理:
第一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置
然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾
以此類推,直到全部待排序的數據元素的個數爲零
var arr = [12, 3, 569, 78, 0, -56, 1223, 11, 16, 13, 1, 12];
function selectSort(arr) {
if (Array.isArray(arr)) { //是數組
for (var i = 0; i < arr.length; i++) {
var minindex = i; //依次假設的最小值的索引下標爲i
var minvalue = arr[minindex]; ////假設的最小值
for (var j = i + 1; j < arr.length; j++) {
if (arr[j] < minvalue) { //如果當前的數組項的值比最小值還要小,當前的值就是這次最小值
minvalue = arr[j]; //當前的值就是最小值
minindex = j; //此時的j就是最小值的索引下標
}
}
//內層的for循環走完一輪,才能得到真正的最小值。纔可以進行交換
if(minindex !== i){ //代表當前假設的最小值不成立的。找到真正的最小值的索引下標
var temp = arr[minindex];
arr[minindex] = arr[i];
arr[i] = temp;
}
}
return arr;
} else { //不是數組
throw new Error('請輸入數組'); //新建錯誤對象,包含錯誤信息,拋出錯誤 throw
}
}
console.log(selectSort(arr))
【快速排序】原理:
待排序的數組中任意截取(splice:改變原數組)一位,截取相對中間一些的位置 - 中間值
準備兩個數組left/right,用餘下的數字分別和中間值進行比較
如果比截取的中間值大放到right數組(push),如果比中間值小放到左邊的數組(push)
分別對left和right數組進行遞歸操作,直到數組的每一項長度爲1或者0(基點)
最終利用concat方法將所有的數組連接起來
var arr = [12, 3, 3, 3, 3, 569, 78, 0, -56, 1223, 1223, 1223, 11, 16, 13, 1, 12];
function quickSort(arr) {
if (Array.isArray(arr)) { //數組
if (arr.length <= 1) { //長度<=1 輸出數組項的值,設爲基點
return arr;
} else { //長度>1 進行遞歸比較
var midindex = parseInt(arr.length / 2) //獲取中間值的索引
var midvalue = arr.splice(midindex, 1)[0]; //改變原數組,截取1位。返回值還是數組。
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < midvalue) {
left.push(arr[i]);
} else { //排序
right.push(arr[i]);
}
// else if (arr[i] > midvalue) {//排序+去重
// right.push(arr[i]);
// }
}
return quickSort(left).concat(midvalue, quickSort(right)); //最終的拼接
}
} else {
throw new Error('請輸入數組');
}
}
console.log(quickSort(arr));