一、冒泡排序
原理
已知一个数组是一组数据,比较相邻两个数字,如果arr[i]>arr[i+1],则交换二者位置。
例如在数组[1, 4, 9, 0, 3, 7, 2]中:
- 第一轮:1<4,不交换位置;4<9,不交换位置;9>0,交换0和9的位置;9>3,交换位置;9>7,交换位置;9>2,交换位置。结束第一轮排序,此时结果为[1,4,0,3,7,2,9]
- 第二轮:1<4,不交换位置;4>0,交换位置;4>3,交换位置;4<7,不交换位置;7>2,交换位置;7<9,不交换位置。结束第二轮排序,此时结果为[1,0,3,4,2,7,9]
- 重复以上步骤,最终结果为:[0,1,2,3,4,7,9]
JS实现
在上个例子中,从第二轮开始的7和9作比较其实是多余的,因为在第一轮的时候已经把最大的值放到最后了,同理,在第三轮的4和7无需比较,所以每次只需要对从索引为0到length - 1 - i
// 冒泡排序
let numArr = [1, 4, 9, 0, 3, 7, 2];
for (let i = 0; i < numArr.length - 1; i++) {
for (let j = 0; j < numArr.length - 1 - i; j++) {
// 如果当前元素大于后一个元素 ,交换位置
if (numArr[j] > numArr[j + 1]) {
numArr[j] = numArr[j] + numArr[j + 1];
numArr[j + 1] = numArr[j] - numArr[j + 1];
numArr[j] = numArr[j] - numArr[j + 1];
}
}
}
console.log(numArr)
二、快速排序
原理
每次选择一个值,一般为数组的第一项,大于该值的放到右边,小于该值的放在左边。按照这个步骤再分别对左边和右边的数据进行排序,重复这个步骤,直到排序结束。
例如在数组[1, 4, 9, 0, 3, 7, 2]中:
JS实现
// 快速排序
let arr = [5, 4, 3, 1, 6, 3, 8, 7];
function quickSort(arr, val) {
if (arr.length <= 1) {
return arr;
}
let pivot = arr[0]; // 选取基准值
let leftArr = [];
let rightArr = [];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < pivot) {
leftArr.push(arr[i]);
} else {
rightArr.push(arr[i]);
}
}
let leftSorted = quickSort(leftArr,'left'); // 对左侧数组进行递归排序
let rightSorted = quickSort(rightArr,'right'); // 对右侧数组进行递归排序
return leftSorted.concat([pivot], rightSorted); // 合并左、中、右三个数组
}
console.log(quickSort(arr))
总结
本篇介绍了冒泡排序和快速排序两种排序方法,并用JS实现了这两种排序,如有错误,欢迎斧正!