快速排序
let quickSort = arr => {
// 只有一个元素时直接 return
if (arr.length <= 1) {return arr;}
// 取得中心基准的下标
// 代码意思是比如 7/2 是3余1,.floor 即只取 3
let pivotIndex = Math.floor(arr.length / 2);
// 把基准元素取出
let pivot = arr.splice(pivotIndex, 1)[0];
// 装左边的数组
let left = [] ;
// 装右边的数组
let right = [] ;
// 遍历取出基准后的数组
for ( let i = 0; i < arr.length; i++){
if(arr[i] < pivot){
// 小于基准元素的放在左边的数组
left.push(arr[i])
} else{
// 大于基准元素的放在右边的数组
right.push(arr[i])
}
}
// 返回结果,左边继续排序(递归)+基准元素+右边继续排序(递归)
return quickSort(left).concat([pivot], quickSort(right))
}
//验证
let arr = [1,3,4,62,3,44,55,632];
var a = quickSort(arr);
console.log(a); // [1, 3, 3, 4,44, 55, 62, 632]
计数排序
let countSort = arr =>{
// 声明一个哈希表为空对象
// 数组中最大值 max 初始值为0
// result 为空数组用来存放排好序的数组
let hashTable = {}, max = 0, result = [] ;
// 遍历未排序的数组中的元素
for(let i=0; i<arr.length; i++){
// 如果当前元素不存在哈希表
if( !(arr[i] in hashTable) ){
// 把当前元素存进哈希表,值记为 1
hashTable[arr[i]] = 1
}else{
// 如果当前元素已在哈希表,给原来哈希表中该元素的值加上 1
hashTable[arr[i]] += 1
}
// 如果当前元素比 max 大,就把该元素赋值给 max
if(arr[i] > max) {max = arr[i]}
}
// 遍历已经记录好的哈希表
for(let j=0; j<=max; j++){
// 如果 j 自增到对应的哈希表中的 key,比如 12,即 12 in hashTable
if( j in hashTable ){
// 比如 hashTable[12],假设其在哈希表中key为 12 的值为 2,即 i < 2
for(let i = 0; i<hashTable[j]; i++){
// i = 0,push 一次 12,自增到 i = 1,再 push 一次 12
result.push(j)
}
}
}
return result
}
// 验证
let arr=[1,3,4,62,3,44,55,632];
var a=countSort(arr);
console.log(a); // [1, 3, 3, 4,44, 55, 62, 632]