剛剛面試完叮称,面試有一題是快速排序种玛,嗯,沒答上來颅拦,于是工資砍1k蒂誉;雖然我覺得這個問題真心不該答不上來教藻,但砍工資我還是不接受距帅,那就只能繼續(xù)好好學(xué)習(xí)
排序方法多,我就了解最常用的括堤,冒泡排序和快速排序
冒泡排序
原理:冒泡排序思想:比較相鄰兩個數(shù)據(jù)的大小碌秸,小的在前面,大的在后面悄窃,如果前面的數(shù)據(jù)比后面的大就交換這兩個數(shù)的位置
實現(xiàn):需要兩層for循環(huán)讥电,外層從第一個數(shù)到倒數(shù)第二個數(shù),內(nèi)層從外層的后面一個數(shù)到最后一個數(shù)
var sort=function(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i]>arr[j]){
var t=a[i];
a[i]=a[j];
a[j]=t
}
}
}
return arr;
}
var a=[2,5,4,1,7,3,8,6,9,0];
console.log(sort(a))
快速排序
原理:先找到一個基準(zhǔn)點(diǎn)(隨機(jī)生成/中間值)轧抗,然后數(shù)組被該基準(zhǔn)點(diǎn)分為兩部分恩敌,依次與該基準(zhǔn)點(diǎn)數(shù)據(jù)比較,如果比它小横媚,放左邊纠炮;反之,放右邊灯蝴。
實現(xiàn):左右分別用一個空數(shù)組去存儲比較后的數(shù)據(jù)恢口。最后遞歸執(zhí)行上述操作,直到數(shù)組長度<=1;
var times=0;
var quickSort=function(arr){
//如果數(shù)組長度小于等于1無需判斷直接返回即可
if(arr.length<=1){
return arr;
}
var midIndex=Math.floor(arr.length/2);//取基準(zhǔn)點(diǎn)
var midIndexVal=arr.splice(midIndex,1);//取基準(zhǔn)點(diǎn)的值,splice(index,1)函數(shù)可以返回數(shù)組中被刪除的那個數(shù)arr[index+1]
var left=[];//存放比基準(zhǔn)點(diǎn)小的數(shù)組
var right=[];//存放比基準(zhǔn)點(diǎn)大的數(shù)組
//遍歷數(shù)組穷躁,進(jìn)行判斷分配
for(var i=0;i<arr.length;i++){
if(arr[i]<midIndexVal){
left.push(arr[i]);//比基準(zhǔn)點(diǎn)小的放在左邊數(shù)組
}
else{
right.push(arr[i]);//比基準(zhǔn)點(diǎn)大的放在右邊數(shù)組
}
console.log("第"+(++times)+"次排序后:"+arr);
}
//遞歸執(zhí)行以上操作,對左右兩個數(shù)組進(jìn)行操作耕肩,直到數(shù)組長度為<=1;
return quickSort(left).concat(midIndexVal,quickSort(right));
};
console.log(quickSort(arr));