导航

排序

Posted on 2018-04-07 21:38  小飞博客  阅读(139)  评论(0编辑  收藏  举报

冒泡排序:

 1 var arr=[1,10,2,100,101,98];
 2 
 3 function bubbleSort(arr){
 4     var len=arr.length,flag=null;
 5     if(len>1){
 6         for(var i=0;i<len-1;i++){
 7             flag=false;//位置变更标识符,可以优化性能
 8             for(var j=0;j<len-1-i;j++){
 9                 if(arr[j]>arr[j+1]){//前一项如果大于后一项
10                     //先存下前一项的值
11                     var temp=arr[j];
12                     //后一项的值赋给前一项
13                     arr[j]=arr[j+1];
14                     //前一项的值赋给后一项
15                     arr[j+1]=temp;
16                     flag=true;//有位置交换则改变flag的值
17                 }
18             }
19             if(!flag){//检测到上一轮已经没有位置变更,就说明排序已经完成
20                 break;
21             }
22         }
23     }
24     return arr;
25 }
26 
27 console.log(bubbleSort(arr));//[1, 2, 10, 98, 100, 101]

插入排序:

 1 var arr=[1,10,2,100,101,98,2];
 2 
 3 function insertSort(arr){
 4     var len=arr.length;
 5     if(len>1){
 6         for(var i=1;i<len;i++){
 7             if(arr[i]<arr[i-1]){//当前项小于前一项的时候才向前插入
 8                 var cur=arr[i],j=i-1;//保存第i项的值,找到前一项的索引
 9                 while(j>=0 && cur<arr[j]){//前一项存在且第i的值小于前一项
10                     arr[j+1]=arr[j];//当前比较项赋值为前一项的值
11                     j--;//继续向前查找
12                 }
13                 arr[j+1]=cur;//将第i项插入到当前位置
14             }
15         }
16     }
17     return arr;
18 }
19 console.log(insertSort(arr));//[1, 2, 2, 10, 98, 100, 101]

快速排序:

 1 var arr=[1,10,2,100,101,98,2];
 2 
 3 function quickSort(arr){
 4     if(arr.length<=1){
 5         return arr;
 6     }
 7     var midIndex=Math.floor(arr.length/2);
 8     var minItem=arr.splice(midIndex,1)[0];
 9     var leftArr=[],rightArr=[];
10     for(var i=0;i<arr.length;i++){
11         var cur=arr[i];
12         cur<minItem?leftArr.push(cur):rightArr.push(cur);
13     }
14     return quickSort(leftArr).concat(minItem,quickSort(rightArr));
15 }
16 console.log(quickSort(arr));//[1, 2, 2, 10, 98, 100, 101]

 

 1 function quickSort(arr){
 2     if(arr.length<=1){
 3         return arr;//如果数组只有一个数,就直接返回;
 4     }
 5 
 6     var num = Math.floor(arr.length/2);//找到中间数的索引值,如果是浮点数,则向下取整
 7 
 8     var numValue = arr.splice(num,1);//找到中间数的值
 9     var left = [];
10     var right = [];
11 
12     for(var i=0;i<arr.length;i++){
13         if(arr[i]<numValue){
14             left.push(arr[i]);//基准点的左边的数传到左边数组
15         } else{
16            right.push(arr[i]);//基准点的右边的数传到右边数组
17         }
18     }
19 
20     return quickSort(left).concat(numValue,quickSort(right));//递归不断重复比较
21 }

 阶乘:

1 function factorial(n) {
2   if (n === 1) return 1;
3   return n * factorial(n - 1);
4 }
1 function factorial(n, total) {
2   if (n === 1) return total;
3   return factorial(n - 1, n * total);
4 }
5 
6 factorial(5, 1)