冒泡排序
先說冒泡,這個原理最簡單,其實一趟冒泡要做的事情就是“把最重的泡泡沉到底下去”,也就是一趟排序要找出最大的數(shù),那怎么實現(xiàn)呢?用當(dāng)前數(shù)字和下一個數(shù)字做比較,如果當(dāng)前>下一個,進(jìn)行值交換,自然就可以通過一次循環(huán)找到最大的數(shù)。
那么我們需要控制的就是循環(huán)次數(shù),這個當(dāng)然是用數(shù)組長度來控制,一趟冒泡后,循環(huán)次數(shù)減一,看下面一段代碼:
function bubbleSort(arr) {
const end = arr.length - 1;
for (let i = end; i >= 0; i--) {
let temp = 0;
for (let k = 0; k < i; k++) {
if (arr[k] > arr[k + 1]) {
arr[k] = arr[k] + arr[k + 1] - (arr[k + 1] = arr[k]);
temp = 1;
}
}
if (temp == 0) {
break;
}
}
return arr;
}
我們可以看到,上面代碼片段中設(shè)置了temp,它是用來做什么的呢?用于標(biāo)記一次循環(huán)時是否發(fā)生了交換。也就是說,如果在一趟循環(huán)結(jié)束后,沒有發(fā)生任何交換,也就是說現(xiàn)在已經(jīng)是升序了,不需要再排了,可以結(jié)束了,這樣就有效的降低了時間復(fù)雜度。
快速排序
快排的思想想必大家也都知道,在一次排序后,數(shù)字a的左邊都是比它小的,右邊都是比它大的。然后對左邊和右邊的數(shù)字做同樣的操作。比如我們先選擇第一個數(shù)a,然后對數(shù)組進(jìn)行循環(huán),遇到比a大的就不管,遇到比a小的就和上一個比a大的數(shù)進(jìn)行交換,數(shù)組循環(huán)完畢后,將a與當(dāng)前正在比對的值進(jìn)行交換,就可以實現(xiàn)“左邊<a<右邊”,然后對左邊右邊的數(shù)據(jù)遞歸排序,具體代碼如下:
function quickSort(arr, start, end) {
let m = start;
if (start >= end) {
return;
}
for (let i = start + 1; i <= end; i++) {
if (arr[i] < arr[start]) {
m++;
arr[i] = arr[i] + arr[m] - (arr[m] = arr[i]);
}
}
arr[start] = arr[start] + arr[m] - (arr[m] = arr[start]);
quickSort(arr, start, m - 1);
quickSort(arr, m + 1, end);
return arr;
}