排序算法(冒泡、快排、插入)
1.冒泡排序:【O(n2)复杂度】
let arr = [100, 52, 42, 122, 11];
// 冒泡排序,跟相邻的相比较
function bubbleSort (arr) {
let len = arr.length;
while (len) {
for (let i =0; i < len-1; i++) {
if (arr[i] > arr[i+1]) {
[arr[i], arr[i+1]] = [arr[i+1], arr[i]]
}
}
len --;
}
return arr
}
bubbleSort(arr);
2.插入排序【O(n2)复杂度】
function inserSort (arr) {
// 和冒泡差不多从后往前插入
for(let j = 1; j < arr.length; j++) {
for(let i = j; i > 0; i--) {
if (arr[i] < arr[i-1]) {
[arr[i-1], arr[i]] = [arr[i], arr[i-1]]
} else {
break
}
}
}
return arr;
}
inserSort(arr);
3.快速排序==>易理解标识位法则【O(logn)复杂度】
function querySort(arr) {
let flag = arr[0];
let left = [];
let right = [];
if (arr.length <=1) {
return arr;
}
for(let i =1;i<arr.length; i++) {
if(arr[i] < flag) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return querySort(left).concat(flag,querySort(right))
}
querySort(arr);
4.快速排序 =》 指针法则:同理找出一个flag,数组头尾各安放一个指针l\r,类似交叉替换;
function querySortNext(arr, l = 0, r = arr.length-1) {
if (l>r) {
return
}
let left = l;
let right = r;
let flag = arr[l];
while (left < right) {
// 右面指针如果大于等于标识位,就往前挪动,左边指针同理
if (left < right && arr[right] >= flag) {
right--;
}
arr[left] = arr[right]
if (left < right && arr[left] <= flag) {
left++;
}
arr[right] = arr[left]
}
arr[left] = flag;
querySortNext(arr, l,left - 1);
querySortNext(arr, left+1,right);
return arr;
}
querySortNext(arr);