冒泡排序:雙層循環(huán)偶芍,內(nèi)部循環(huán)每次選出最大值或者最小值贞铣,放到頭上或者放在尾部
function sort (arr, sorting = 1) {
if (sorting < 0) { //逆序
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
let a = arr[i];
arr[i] = arr[j];
arr[j] = a;
}
}
}
} else { //正序
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
let a = arr[i];
arr[i] = arr[j];
arr[j] = a;
}
}
}
}
}
快速排序:遞歸調(diào)用寥茫,每次遞歸選出一個“中值”掌桩,頭部和尾部分別跟“中值”比較边锁,找出可交換值后交換位置。每次交換后波岛,數(shù)組的逆序減少比其他排序算法要多茅坛,所以相對比較快
function quickSort(arr, start, end, sorting = 1) {
if(start > end){
return;
}
let i = start;
let j = end;
let m = arr[start];
if (sorting < 0) { //逆序
while (i < j) {
//先看右邊,依次往左遞減
while (m <= arr[j] && i < j) { //6<5 9
j--;
}
//再看左邊,依次往右遞增
while (m >= arr[i] && i < j) { //6>=7
i++;
}
//如果滿足條件則交換
if (i < j) {
let t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
} else { // 正序
while (i < j) {
//先看右邊贡蓖,依次往左遞減
while (m >= arr[j] && i < j) { //6<5 9
j--;
}
//再看左邊曹鸠,依次往右遞增
while (m <= arr[i] && i < j) { //6>=7
i++;
}
//如果滿足條件則交換
if (i < j) {
let t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
}
//最后將基準為與i和j相等位置的數(shù)字交換
arr[start] = arr[i];
arr[i] = m;
//遞歸調(diào)用左半數(shù)組
quickSort(arr, start, j - 1, sorting);
//遞歸調(diào)用右半數(shù)組
quickSort(arr, j + 1, end, sorting);
}