1. 快速排序
思路:
1. 先從這個數組中取出中間一項的位置;
2. 取到這個中間位置對應的值;
3. 拿數組中的每一項,跟中間值進行比較;如果比他小,放左邊的數組; 如果比他大,就放右邊的數組;
4. 什麼時候停止切分: 數組的長度<=1;
代碼:
var ary=[21,8,5,34,9];
function quickSort(ary){
if(ary.length<=1){
return ary;
}
var num=Math.floor(ary.length/2);
var numValue=ary.splice(num,1)[0];
var left=[];
var right=[];
for(var i=0; i<ary.length; i++){
var cur=ary[i];
if(cur<numValue){
left.push(cur);
}else{
right.push(cur);
}
}
return quickSort(left).concat([numValue],quickSort(right));
}
console.log(quickSort(ary))
2. 插入排序
思路:
1.left=[4,5,8,21,32]
2.拿數組中的每一項,跟左手中的每一項,從後往前的進行比較:
如果比左手中的牌大,應該放在左手這張牌的後面(放在這張牌的下一張牌的前面)
如果比左手中的牌小,,繼續往左邊比較,比較到索引===-1;還是小的話,插入到left最前面;
return left;
代碼:
var ary=[21,8,5,34,9];
function insertSort(ary){
var left=ary.splice(0,1);
for(var i=0; i<ary.length; i++){
var cur=ary[i];
for(var j=left.length-1; j>=0;){
var nex=left[j];
if(cur<nex){
j--;
if(j===-1){
left.unshift(cur);
}
}else{
left.splice(j+1,0,cur);
break;
}
}
}
return left;
}
3. 冒泡排序
思路:
//var ary=[21,8,5,34,9];
第一輪:比較4次;雖然沒有實現最終目標,但是已經把最大值放在數組的末尾;
[8,21,5,34,9]
[8,5,21,34,9]
[8,5,21,34,9]
[8,5,21,9,34]
第二輪:比較3次;雖然沒有實現最終目標,但是把次大值數組的後面
[5,8,21,9,34]
[5,8,21,9,34]
[5,8,9,21,34]
第三輪:比較2次;
[5,8,9,21,34]
第四輪:比較1次;
第五輪:比較0次;
代碼:
var ary=[21,8,5,34,9];
for(var i=0; i<ary.length; i++){
for(var j=0; j<ary.length-i-1;j++){
if(ary[j]>ary[j+1]){
var tmp=ary[j+1];
ary[j+1]=ary[j];
ary[j]=tmp;
}
}
}
console.log(ary);
遞歸算法
使用callee實現自己調用自己,金典遞歸 n!
function fact(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
var anotherFact = fact;
fact = null;
alert(antherFact(4));