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 ));