快速排序法
image.pngfunction quick(arr) { //4.結(jié)束遞歸,(當(dāng)arr中小于等于一項(xiàng),則不用處理) if (arr.length <= 1) { return arr } //1.找到數(shù)組的中間項(xiàng),在原有數(shù)組中把它移除 let middleIndex = Math.floor(arr.length / 2) let middleValue = arr.splice(middleIndex, 1)[0] //2.準(zhǔn)備左右兩個數(shù)組,循環(huán)剩下數(shù)組中的每一項(xiàng),當(dāng)比中間值小的放到左邊數(shù)組中,反之放到右邊數(shù)組中 let arrLeft = [] let arrRight = [] //3.遞歸方式讓左右兩邊的數(shù)組持續(xù)這樣處理,一直到左右兩邊都排好序?yàn)橹? //到最后讓左邊+中間+右邊拼接成最后的結(jié)果 for (let i = 0; i < arr.length; i++) { let item = arr[i] item < middleValue ? arrLeft.push(item) : arrRight.push(item) } // return quick(arrLeft).concat(middleValue, quick(arrRight)) return [...quick(leftArr),middleValue,...quick(rightArr)] }
冒泡排序法
- 冒泡排序的思想:
讓數(shù)組中的當(dāng)前項(xiàng)和后一項(xiàng)進(jìn)行比較,如果當(dāng)前項(xiàng)比后一項(xiàng)大,則兩項(xiàng)交換位置(讓大的靠后即可)
image.pngfunction bubble(arr) { let temp = null; //外層循環(huán)控制比較的輪數(shù) for (var i = 0; i < arr.length - 1; i++) { //里層循環(huán)控制每一輪比較的次數(shù) for (var j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j] arr[j] = arr[j + 1] arr[j + 1] = temp } } } return arr; }
插入排序
把一個數(shù)插入到一個有序數(shù)列的合理位置,并使插入后數(shù)列仍然有序,
不斷重復(fù)這個過程就能使整個數(shù)組成為有序數(shù)列
function insert(ary){
// 1.準(zhǔn)備一個新數(shù)組,用來存儲抓到手里的牌,開始先抓一張牌進(jìn)來
let handle=[];
handle.push(ary[0]);
// 2.從第二項(xiàng)開始依次抓牌,一直到把臺面上的牌抓光
for(let i=1;i<ary.length;i++){
// A是新抓的牌
let A=ary[i];
// 和HANDDLE手里的牌依次比較(從后向前比)
for(let j=handle.length-1;j>=0;j--){
// 每一次要比較的手里的牌
let B=handle[j];
// 如果當(dāng)前新牌A比要比較的牌B大了,把A放到B的后面
if(A>B){
handle.splice(j+1,0,A);
break;
}
// 已經(jīng)比到第一項(xiàng),我們把新牌放到手中最前面即可
if(j===0){
handle.unshift(A);
}
}
}
return handle;
}
let ary = [12,8,24,16,1];
ary=insert(ary);
console.log(ary);
//自己寫的另一種方式
function insert(arr){
let handle = []
handle.push(arr[0])
for(var i=1;i<arr.length;i++){
for(var j=0;j<handle.length;j++){
if(arr[i]<handle[j]){
handle.splice(j,0 ,arr[i])
break;
}
if(j==handle.length){
handle.push(arr[i])
}
}
}
return handle
}