1.希尔排序 时间复杂度 O(nlog2 n)到O(n^2)
是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
function sellSort(arr,index){
if(!index){index=1;}
var len = arr.length;
if(len<=1) return arr;
var key = parseInt(len/(2*index)),i=0;
if(key<1) return arr;
console.log(key)
while(arr[i]&&arr[i+key]){
if(arr[i]>arr[i+key]){
[arr[i],arr[i+key]] = [arr[i+key],arr[i]];
}
i++;
}
index++;
arr = sort(arr,index);
return arr;
}
2.直接插入排序 O(n^2)
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。
function detectSort(arr){
if(arr.length<=1) return arr;
var i =1;
for(;i<arr.length;i++){
var key=i; console.log('s'+key)
while(arr[key]&&arr[key-1]){
if(arr[key-1]>arr[key]){
[arr[key],arr[key-1]] = [arr[key-1],arr[key]];
}
console.log(arr)
key--;
}
}
return arr;
}
3.快速排序 O(nlog2 n) 最坏O(n^2)
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
function sort(arr){
if(arr.length<=1) return arr;
var left = [],right=[],key=0,mids=[];
for(let item of arr){
if(arr[0]>item){
left.push(item)
}else if(arr[0]<item){
right.push(item)
}else{
mids.push(item)
}
}
var _left = sort(left), _right=sort(right);
return _left.concat(mids,_right)
}
一条表达式:
function quickSort(arr){
return arr.length<=1? arr:quickSort(arr.slice(1).filter( a=> a<arr[0])).concat(arr.filter( a=> a==arr[0]),quickSort(arr.slice(1).filter( a=> a>arr[0])))
}
归并排序 时间复杂度 O(n log n) 空间复杂度 O(n)
基本思想是:建立在归并操作上的一种有效的排序算法,该算法是采用分治法
function sort(arr){
if(arr.length<=1) return arr;
var left = [], right=[] ,key =arr.length/2;
if(key==1){}
arr.forEach(function(item,i){
if(key>i){
left.push(item)
}else{
right.push(item)
}
})
return merge(sort(left),sort(right));
}
function merge(left,right){
var arr=[];
while(left.length>0&&right.length>0){
var x=left.shift(),y=right.shift();
if(x>y){
arr.push(y);left.unshift(x);
}else{
arr.push(x); right.unshift(y);
}
}
return arr.concat((left),(right))
}