冒泡排序
先说冒泡,这个原理最简单,其实一趟冒泡要做的事情就是“把最重的泡泡沉到底下去”,也就是一趟排序要找出最大的数,那怎么实现呢?用当前数字和下一个数字做比较,如果当前>下一个,进行值交换,自然就可以通过一次循环找到最大的数。
那么我们需要控制的就是循环次数,这个当然是用数组长度来控制,一趟冒泡后,循环次数减一,看下面一段代码:
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;
}
网友评论