对于排序算法肯定不陌生吧,让我们来见识见识
常用算法有哪些呢?
冒泡排序
1.冒泡排序
这因该算我们熟悉的第一个排序方法吧,就是每次比较两个数字,通过判断进行前后交换,知道数组中没有可以交换的数,算法结束
function maopao(arr) { // 英语不好
var len = arr.length;
for (var i = 0; i < len-1; i++) {
for (var j = i+1; j < len; j++) { // 确保 j 比 i 大 1
if (arr[i] > arr[j]) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr; // 返回新的数组
}
var arr = [ 1,78,3,67,98,25,108,78,26]
maopao(arr) // 执行方法
console.log(arr) // [1, 3, 25, 26, 67, 78, 78, 98, 108]
2.选择排序
选择排序也比较容易理解,先从一个数组中找到最小(大)的,然后把这个数提取第一个位置,再从剩余里面继续找最小(大)的,完成排序
function select(arr) {
var len = arr.length;
var temp;
var min; // 先默认第一个最小
for(let i = 0;i < len-1; i++) {
min = i
for(let j = i+1; j < len; j++) {
if(arr[j] < arr[i]) {
min = j
}
}
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
return arr
}
var arr = [78,65,45,67,12,98]
select(arr)
console.log(arr) // [12, 45, 65, 67, 78, 98]
3.插入排序
// 类似于斗地主,对自己的牌排序
function insert(array) {
for (var i = 1; i < array.length; i++) {
var key = array[i]; // 抽出来的牌
var j = i - 1;
while (j >= 0 && array[j] > key) { // 抽出来牌的和前一个比较
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
return arr
}
var arr = [78, 65, 45, 67, 12, 98,5]
insert(arr)
console.log(arr) // [5, 12, 45, 65, 67, 78, 98]
4.sort
sort 依据返回值
function SortArr(arr) {
arr.sort((a,b) => {
return a-b
})
return arr
}
var arr = [78, 65, 45, 67, 12, 98,5]
SortArr(arr)
console.log(arr) // [5, 12, 45, 65, 67, 78, 98]
5. 快速排序 (递归的典型)
这个方法是我从阮一峰那里学的,
想法就是先选中中间数作为参考值,小于中间值的放在左边,大于中间值的放在右边,然后进行递归,使得左边右边重复这个操作,直到左右两边数组长度只有一个的时候
var quickSort = function(arr) {
if (arr.length <= 1) {
return arr;
}
var index = Math.floor(arr.length / 2);
var middle = arr.splice(index, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < middle) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([middle], quickSort(right)); // 递归
};
var arr = [85, 24, 63, 45, 17, 31, 96, 50];
quickSort(arr);
console.log(quickSort(arr)); // [24, 31, 45, 50, 63, 85, 96]
目前理解的就这几种,其他方法暂未理解,持续更新ing