【算法】排序方法总结及简单js实现
所有排序默认从小到大
冒泡排序
// 相邻元素比较,替换。每次确定一个最大/最小值,最值在数组最后一个
function bubbleSort(arr){
for(let i=0;i<arr.length;i++){
// 外循环控制次数
for(let j=0;j<arr.length-1-i;j++)
// 内循环进行相邻值比较替换
if(arr[j] > arr[j+1]){
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
return arr;
}
插入排序
// 从数组首部开始构建有序数列,后面的元素按序插入首部,并入有序数列。
function insertSort(arr){
for(let i=1;i<arr.length;i++){
// 外部循环确定基准(即首部有序数列后的第一个元素)
let temp = arr[i];
for(let j=i;j>=0;j--){
// 内部循环通过从后往前一点一点比较,将基准元素插入合适位置。
if(temp < arr[j-1]){
arr[j] = arr[j-1];
}else{
arr[j] = temp;
break;
}
}
}
return arr;
}
快速排序
// 用递归方法。利用基准元素,将数组分成左(元素均小于基准)右(元素均大于基准)数组。
function quickSort(arr){
if(arr.length <= 1){
return arr;
}
var left = [], right = [];
var temp = arr[0];
for(let i=1; i<arr.length;i++){
if(arr[i] > temp){
right.push(arr[i]);
}else{
left.push(arr[i]);
}
}
return quickSort(left).concat(temp, quickSort(right));
}
选择排序
// 也是使首部有序。每一轮遍历都找出最大/小值,放入首部末尾。
function selectSort(arr){
var minIndex = 0;
for(let i=0;i<arr.length - 1;i++){
minIndex = i;
for(let j=i+1;j<arr.length;j++){
if(arr[minIndex]>arr[j]){
minIndex=j;
}
}
[arr[minIndex], arr[i]] = [arr[i], arr[minIndex]];
}
return arr;
}
归并排序
// 也是使首部有序。每一轮遍历都找出最大/小值,放入首部末尾。
function merge(left, right){
var temp =[];
while(left.length && right.length){
if(left[0] > right[0]){
temp.push(right.shift());
}else{
temp.push(left.shift());
}
}
return temp.concat(left, right);
}
function mergeSort(arr){
var len = arr.length;
if(len < 2){
return arr;
}
var mid = Math.floor(len/2), left = arr.slice(0, mid), right =arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}