冒泡排序
先說冒泡,這個原理最簡單,其實一趟冒泡要做的事情就是“把最重的泡泡沉到底下去”,也就是一趟排序要找出最大的數,那怎么實現呢?用當前數字和下一個數字做比較,如果當前>下一個,進行值交換,自然就可以通過一次循環找到最大的數。
那么我們需要控制的就是循環次數,這個當然是用數組長度來控制,一趟冒泡后,循環次數減一,看下面一段代碼:
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;
}
我們可以看到,上面代碼片段中設置了temp,它是用來做什么的呢?用于標記一次循環時是否發生了交換。也就是說,如果在一趟循環結束后,沒有發生任何交換,也就是說現在已經是升序了,不需要再排了,可以結束了,這樣就有效的降低了時間復雜度。
快速排序
快排的思想想必大家也都知道,在一次排序后,數字a的左邊都是比它小的,右邊都是比它大的。然后對左邊和右邊的數字做同樣的操作。比如我們先選擇第一個數a,然后對數組進行循環,遇到比a大的就不管,遇到比a小的就和上一個比a大的數進行交換,數組循環完畢后,將a與當前正在比對的值進行交換,就可以實現“左邊<a<右邊”,然后對左邊右邊的數據遞歸排序,具體代碼如下:
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;
}