学习目标:
前端js几种排序算法
冒泡排序:
重复地走访过要排序的数列,相邻元素两两对比,交换 时间复杂度是 O(N 2 )
javascript
function bubbleSort(arr){
for(let i=0;i<arr.length-1;i++){
for(let j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
let tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
return arr
}
快速排序:
从数组中选择任意一个基准,所有比基准小的元素放在基准的左边,比基准大的元素放到基准的右边 时间复杂度为O(n*logn) 数据过大且数据杂乱无章时,则适合采用快速排序
javascript
function quickSort(arr){
const rec = (arr)=>{
if(arr.length<=1)return arr;
let left = [];
let right = [];
let mid = arr[0];
for(let i=1; i<arr.length; i++){
if(arr[i]<mid){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return [...rec(left),mid,...rec(right)]
}
return rec(arr)
}
选择排序:
首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置 然后再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾 时间复杂度O(n²)
javascript
function selectSort(arr){
let tmp,minIndex;
for(let i=0;i<arr.length-1;i++){
minIndex = i;
for(let j=i+1;j<arr.length;j++){
if(arr[j]<arr[minIndex]){
minIndex = j
}
}
tmp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = tmp
}
return arr
}
插入排序:
将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据 时间复杂度(O(n)---O(n^2)) 适用于数据量不大,算法稳定性要求高,且数据局部或整体有序的数列排序
javascript
function insertSort(arr){
let preIndex,current;
for(let i=1;i<arr.length;i++){
preIndex = i-1;
current= arr[i];
while(preIndex>=0&&arr[preIndex]>current){
arr[preIndex+1]=arr[preIndex]
preIndex--;
}
arr[preIndex+1] = current
}
return arr
}
归并排序:
含有n个记录的无序表,进行两两合并,变为n/2个长度为2或者1的有序表。不断进行两两合并,直到得到一个长度为 n 的有序表为止。 时间复杂度为nlogn
javascript
function mergeSort(arr){
if(arr.length<2) return arr;
let mid = Math.floor(arr.length/2)
let left = arr.slice(0,mid)
let right = arr.slice(mid)
return merge(mergeSort(left),mergeSort(right))
}
function merge(left,right){
const result = []
while(left.length&&right.length){
if(left[0]<=right[0]){
result.push(left.shift())
}else{
result.push(right.shift())
}
}
while(left.length){
result.push(left.shift())
}
while(right.length){
result.push(right.shift())
}
return result
}