一 插入排序
直接插入排序
根据顺序将未排序数组中的元素一一插入已排序好的数组中
function insert(arr){ var source = arr;
var result = [];
for(var i=0; i<source.length; i++){ //时间频度 n
if(i==0){ //n
result[0]=source[0] //1
} else{
for(var j=0; j<result.length; j++){ //n^2-1
if(source[i]<result[j]){ //n^2
result.splice(j, 0, source[i]); n^2
break;
} else {
if(j==result.length-1) { n^2
result[j+1]=source[i]; n^2
break;
}
}
}
}
}
return result; }
时间复杂度: O(n^2)
二 选择排序
二元选择排序
将代排序数组中的最大和最小值选出来分别移到数组的两端
function minMax(arr){
if(arr.length<=1){
return arr[0];
}
var minIndex, maxIndex;
for(var k=0; k<arr.length; k++){ // n^2
if(k==0){
if(arr[k]<=arr[k+1]){
minIndex=k;
maxIndex=k+1;
} else {
minIndex=k+1;
maxIndex=k;
}
} else{
if(k>=2){
if(arr[k]<arr[minIndex]){
minIndex=k
} else if(arr[k]>arr[maxIndex]){
maxIndex=k
}
}
}
}
var result={min:arr[minIndex], max:arr[maxIndex]}
if(minIndex<=maxIndex){
arr.splice(minIndex, 1);
arr.splice(maxIndex-1, 1);
} else{
arr.splice(maxIndex, 1);
arr.splice(minIndex-1, 1)
}
return result
}
function select(arr){
var source=arr;
var result=[];
result.length=source.length;
var length=source.length;
for(var i=0; i<length/2; i++){ // n/2
var min_max=minMax(source)
if(typeof min_max === 'number'){
result[i]=min_max;
break;
}
var min=min_max.min;
var max=min_max.max;
result[i]=min;
result[length-i-1]=max;
}
console.log(result)
}
var arr=[1,5,2,5,47,8,9,4,7];
select(arr)
时间复杂度:O(n^2)
三 交换排序
冒泡排序
function prop(arr){
var length=arr.length; for(var i=length-1; i>0; i--){ //n
var exchange=true;
for(var j=0; j<i; j++){ //n^2
if(arr[j]>arr[j+1]){
arr.splice(j, 2, arr[j+1], arr[j]);
exchange=false
}
}
if(exchange){
break;
}
}
console.log(arr)
}
时间复杂度:O(n^2)