常用排序算法


1.冒泡排序

外层循环控制坑位,内层循环控制找到合适的数,两者循环方向相反。

function bubbleSort(arr){
    for(var outer=arr.length-1;outer>0;outer--){    //每次循环填好一个坑;剩最后一个数时(下标为0)不用比较
        for(var inner=0;inner<outer;inner++){    //找到合适的一个数,前后两个数比较;后面排好了的坑位不用循环
            if(arr[inner]>arr[inner+1]){        //是否交换
                var temp=arr[inner];
                arr[inner]=arr[inner+1];
                arr[inner+1]=temp;
            }
        }
    }
}

2.选择排序

查找过程和冒泡排序相同,但交换次数会更少,性能更高。内外层循环方向相同。

function selectionSort(arr){
     for(var outer=0;outer<arr.length;outer++){          //外层循环控制坑位,每次填一个坑位
        var tempPos=outer,temp;                   //通过内层循环找出当此循环的最小值;因为js变量作用域的原因,tempPos必须重新赋值
        for(var inner=outer+1;inner<arr.length;inner++){    //内部循环下标从外部循环坑位的后一个位置开始
            if(arr[inner]<arr[tempPos]){             //如果外循环的值大于内循环的值,说明有更小的值,就将该值的下标保存在临时变量中
                tempPos=inner;
            }
        }
        if(tempPos!=outer){                                        //内层循环结束,两个下标不一致时,将坑内的值和最小值交换一次就够了
            temp=arr[outer];                      
         arr[outer]=arr[tempPos];
         arr[tempPos]=temp; 
        }
  } 
} 

 

3.插入排序

将无序的部分循环插入到有序的序列中,效率在这3者中最高。

function insertionSort(arr){
  for(var outer=1;outer<arr.length;outer++){  //每次排序一个元素
    var inner=outer;
       var temp=arr[outer];
    while(temp<arr[inner-1]){      //之前的元素已经排好序。通过比较大小找到当前元素的正确位置;当前元素较小则之前的元素往后移动一格,直到将要排序的元素大于其值;最后在正确的位置上赋值。
      arr[inner]=arr[inner-1];    //较大数后移一位
      inner--;
    }
    arr[inner]=temp;
  }

}

4.快速排序

对于大数据集处理最快

function quickSort(arr){
    if(arr.length==0){                //递归结束条件
      return [];    
    }
    var left=[], right=[], devider=arr[0];
    for(var i=1;i<arr.length;i++){      //以devider为界分成2边
      if(arr[i]<devider){
      left.push(arr[i])   }
else{   right.push(arr[i])   } } return quickSort(left).concat(devider,quickSort(right)); //递归调用继续一分为二排序 }

 

posted @ 2017-02-04 17:38  开发之路  阅读(202)  评论(0编辑  收藏  举报