今天總結了幾個比較基礎常用的排序算法。寫下來,以後可以直接參考。
var o = {
//冒泡排序(穩定)
popSort:function(arr){
var temp,len;
for(var i =0;len = arr.length,i<len-1;i++){
for(var j = 0;j<len-1-i;j++){ //比較趟數
if(arr[j]>arr[j+1]){ //每趟比較次數len-1-i
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
},
//插入排序(穩定)
/*
*假設待排序的記錄存放在數組R[1……n]中,初始時,R[1]自成一個有序區,不需要比較,
無序區R[2...n],從i=2起到i=n爲止,依次將R[i]插入當前有序區。
帶插入的記錄R[i]從右向左與有序區的R[j]比較,
若R[j]>R[i],則R[j]後移一個位置
若R[j]<=R[i],則查找結束,j+1即爲R[i]插入位置
*
*/
insertSort:function(array) {
var i, j, temp,len = array.length;
for(i = 1; i < len; i ++) {
temp = array[i];
for(j = i - 1; j >= 0; j --){
if(array[j] > temp){
array[j + 1] = array[j];
}else {
break;
}
}
array[j + 1] = temp;
}
return array;
},
//選擇排序(不穩定)
selectSort:function (a){
var i,j;
var t;//臨時暫存變量
var len = a.length;
for(i = 0;i<len-1;i++){
for(j = i+1 ;j < len; j++){//將第i個元素與其後各個元素比較
if(a[j]<a[i]){//如果第j個元素比第i個元素小,
t = a[i]; //將最小元素與a[i]交換
a[i] = a[j];
a[j] = t;
}
}
}
return a;
},
//快速排序(不穩定)
quicksort:function (a,low,high){
var i = low;
var j = high;
var temp = a[i]; //用子集第一個元素作樞軸記錄
if( low < high){
while(i < j){ //從數組兩端交替向中間掃描
while((a[j] >= temp) && (i < j)){ j--; }
a[i] = a[j]; //將比數軸記錄小的移動到低的那一端
while((a[i] <= temp) && (i < j)){ i++; }
a[j]= a[i]; //將比數軸記錄大的移動到高的那一端
}
a[i] = temp; //樞軸記錄到位
// quicksort(a,low,i-1); // quicksort(a,j+1,high);
arguments.callee(a,low,i-1);
arguments.callee(a,j+1,high);
}
else{ return; }
return a;
}
};
//o.popSort([1,2,0,-7,11,99,5,-2,2]);
//o.insertSort([1,2,0,-7,11,99,5,-2,2]);
//o.selectSort([1,2,0,-7,11,99,5,-2,2]);
//o.quicksort([1,2,0,-7,11,99,5,-2,2],0,8);
測試結果:
如圖: