1.选择排序
算法思路:它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
选择排序是不稳定的排序方法。算法复杂度为O(n^2)
JS实现
function random(from,to,n){
var arr=[];
for(var i=0;i<n;i++){
var s=parseInt(Math.random()*(to-from))+from;
arr.push(s);
}
return arr;
}
function chooseSort(arr,n){
for(var i=0;i<n;i++){
var minIndex=i;
for(var j=i;j<arr.length;j++){
if(arr[j]<arr[minIndex]){
minIndex=j;
}
}
arr=swap(arr,i,minIndex);
}
return arr;
}
function swap(arr,a,b){
var temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
return arr;
}
(function(){
var arr=random(0,1000,20);
console.log(arr);
var result=chooseSort(arr,20);
console.log(result);
})();
2.插入排序
算法思路:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
时间复杂度为O(n^2)。是稳定的排序方法。
插入排序在用于几乎有顺序的数组时,效率甚至比归并算法要高。
JS实现:
function random(from,to,n){
var arr=[];
for(var i=0;i<n;i++){
var s=parseInt(Math.random()*(to-from))+from;
arr.push(s);
}
return arr;
}
function insertSort(arr,n){
for(var i=1;i<n;i++){
var target=arr[i];
var index=i;//这里的j是元素待插入的位置
for(var j=i;j>0&&target<arr[j-1];j--){//在这里对代码进行了优化,当待插入的元素比已经排好序的最后一个元素数值都大,那就无需在执行一下操作。
arr[j]=arr[j-1];
}
arr[j]=target;
}
return arr;
}
(function(){
var arr=random(0,10,5);
console.log(arr);
var result=insertSort(arr,5);
console.log(result);
})();
3.归并排序
算法思想:该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
算法复杂度为O(n)
JS实现:
var array=[];
function random(from,to,n){
var arr=[];
for(var i=0;i<n;i++){
var s=parseInt(Math.random()*(to-from))+from;
arr.push(s);
}
return arr;
}
function merge(arr,l,mid,r){
var aux=[];
for(var i=l;i<=r;i++){
aux.push(arr[i]);
}
var i=l,j=mid+1;
for(var k=l;k<=r;k++){
if(i>mid){
arr[k]=aux[j-l];
j++;
}else if(j>r){
arr[k]=aux[i-l];
i++;
}else if(aux[i-l]<=aux[j-l]){
arr[k]=aux[i-l];
i++;
}else if(aux[i-l]>aux[j-l]){
arr[k]=aux[j-l];
j++;
}
}
console.log(arr);
}
function mergeSort(arr,l,r){
if(l>=r){
return
}
var mid=parseInt(1/2*(l+r));
mergeSort(arr,l,mid);
mergeSort(arr,mid+1,r);
merge(arr,l,mid,r);
}
function swap(arr,a,b){
var temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
return arr;
}
(function(){
array=random(0,100,20);
console.log(array);
var result=mergeSort(array,0,19);
console.log(array);
})();
4.其他排序