1.选择排序
时间复杂度:O(n²)
算法原理:
在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
实现代码:
function sort(arry,type){
var type=type || "asc";//默认升序
for (var i = 0,l=arry.length; i<l; i++) {
var minIndex=i; //记录最值的下标
var temp;
for(var j=i+1;j<l;j++){
if(type=='asc'){
if(arry[j]<arry[minIndex]){
minIndex=j;
}
}else{
if(arry[j]>arry[minIndex]){
minIndex=j;
}
}
}
//
temp = arry[i];
arry[i] = arry[minIndex];
arry[minIndex] = temp;
}
return arr;
}
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];
console.log(sort(arr,"aa"));
优点:
稳定,无论什么数据进去都是O(n²)的时间复杂度
适用情形:
数据量越小越好
2.插入排序
时间复杂度:O(n²)
算法原理:
插入排序算法有种递归的思想在里面,它由N-1趟排序组成。初始时,只考虑数组下标0处的元素,只有一个元素,显然是有序的。
然后第一趟 对下标 1 处的元素进行排序,保证数组[0,1]上的元素有序;
第二趟 对下标 2 处的元素进行排序,保证数组[0,2]上的元素有序;
…..
…..
第N-1趟对下标 N-1 处的元素进行排序,保证数组[0,N-1]上的元素有序,也就是整个数组有序了。
它的递归思想就体现在:当对位置 i 处的元素进行排序时,[0,i-1]上的元素一定是已经有序的了。
实现代码:
function sort(arry){
for (var i = 1,l=arry.length; i<l; i++) {
//寻找元素arry[i]的合适插入的位置
for(var j=i;j>0;j--){
if(arry[j] < arry[j-1]){
var temp=arry[j];
arry[j]=arry[j-1];
arry[j-1]=temp;
}else{
break;
}
}
}
return arry;
}
var arr=[1,45,37,5,48,15,37,26,29,2,46,4,17,50,52];
console.log(sort(arr,"aa"));
优化
上述代码因为存在频繁的交换位置,所以存在性能问题。
function sort(arry){
for (var i = 1,l=arry.length; i<l; i++) {
//寻找元素arry[i]的合适插入的位置
var current=arry[i];
var j;
for(j=i;j>0&&arry[j-1] > current;j--){
arry[j]=arry[j-1];
}
arry[j]=current;
}
return arry;
}
或者
function insertionSort(arr) {
var len = arr.length;
var preIndex, current;
for (var i = 1; i < len; 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;
}
适用情形:
如果数据大体是有序的,使用插入排序是非常合适的。
待续