常见排序算法的JS实现

 1     var array = [5,1,3,6,7,9,3,7,10,2,56,25];
 2     /*
 3      *冒泡排序 时间复杂度[O(n^2)]
 4      *俩俩比较相邻的元素,如果逆序则交换
 5      */
 6      
 7     
 8     function bubbleSort(arr) {
 9         //可优化,用flag来判断是否已经排序完成,如果是退出循环
10         var len = arr.length-1, temp, i, j;
11         for(i = 0;i < len;i++) {
12             for(j = 0;j<len;j++){
13                 if(arr[j]>arr[j+1]) {
14                     temp = arr[j];
15                     arr[j] = arr[j+1];
16                     arr[j+1] = temp;
17                 }else{
18                     continue;
19                 }
20             }
21         }
22         return arr;
23     }
24     
25     console.log(bubbleSort(array));

 

 

 

 1      var array = [5,1,3,6,7,9,3,7,10,2,56,25];
 2      /*
 3      *选择排序 时间复杂度[O(n^2)]
 4      *每次从未排序的序列中找到最小值,记录并最后存放到已排序序列的末尾
 5      */
 6     
 7     
 8     function selectionSort(arr) {
 9         var len = arr.length, temp, i, j, _min, minindex;
10         for(i = 0;i < len;i++) {
11             _min = arr[i];
12             minindex = i;
13             for(j = i + 1;j < len;j++){
14                 if(_min > arr[j]) {
15                     _min = arr[j];
16                     minindex = j;
17                 }
18             }
19             arr[minindex] = arr[i];
20             arr[i] = _min;
21             
22         }
23         return arr;
24     }
25     console.log(selectionSort(array));     

 

 

 

    /*
     *插入排序
     *一次选择一个待排序的数据,插入到前边已经排好序的序列中。
     */
     
    var array = [5,1,3,6,7,9,3,7,10,2,56,25];
    //直接插入排序 
    function insertSort(arr) {
        var len = arr.length, temp, i, j;
        for(i = 1; i < len; i++) {
            if(arr[i] < arr[i-1]) {
                temp = arr[i];
                for(j = i - 1;j >= 0 && arr[j] > temp; j--) {
                    arr[j+1] = arr[j];
                }
                arr[j+1] = temp    //将小值插入对应位置            
            }
        }
        return arr;        
    }
    
    console.log(insertSort(array));
    
    //折半插入排序
    
    function insertBinarySort(arr) {
        var len = arr.length, i, j, low, high, mid, temp;
        for(i = 1;i < len; i++) {
            if(arr[i] < arr[i-1]) {
                temp = arr[i];
                low = 0;
                high = i - 1;
                while(low <= high) {
                    mid = Math.ceil((low + high) / 2);
                    if(temp < arr[mid]) {
                        high = mid - 1;
                    }else {
                        low = mid + 1;
                    }
                }
                for(j = i;j > low;j--) {
                    arr[j] = arr[j-1];
                }
                arr[low] = temp;
            }
        } 
        return arr;
    }
    console.log(insertBinarySort(array));

 

 

    /*
     *快速排序
     *通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
     *然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
     */    
     
    var array = [5,1,3,6,7,9,3,7,10,2,56,25];
    function quickSort(arr){
        function sort(prev, maxsize){
            var nonius = prev, j = maxsize -1, temp = arr[prev];
            if ((maxsize - prev) > 1) { //单个元素数组直接返回
                while(nonius < j){
                    for( ; nonius < j; j--){
                        if (arr[j] < temp) {
                            arr[nonius++] = arr[j];
                            break;
                        };//当找到比基准小的元素时,将小的元素赋值给arr[nonius],而arr[j]本身则由下个for循环找出大的元素填充
                    }
                    for( ; nonius < j; nonius++){
                        if (arr[nonius] > temp){
                            arr[j--] = arr[nonius];
                            break;
                        }//将大的元素填充到arr[j] , j--;
                    }
                }
                arr[nonius] = temp; //最后的空白将基准填充,基准左边全是比基准小的,右边是比自己大的。
                sort(0, nonius);
                sort(nonius + 1, maxsize); //对左右两个数组递归快排
            }
        }
        sort(0, arr.length);
        return arr;
    }
    console.log(quickSort(array));

 

 

   /*
     *希尔排序(插入排序的改进,实质上是一种分组插入方法)
     *取一个合适的gap,缩小间隔gap,重复子序列划分和排序,最后gap=1,将所有元素放到一个序列中进行插入排序
     */
     
    var array = [5,1,3,6,7,9,3,7,10,2,56,25];
    function shellSort(arr) {
        var len = arr.length, fraction, i, j, temp, fraction = Math.floor(len / 2);
        for(;fraction > 0;fraction = Math.floor(fraction / 2)){
            for(i = fraction;i < len;i++){
                for(j = i - fraction;j >= 0 && arr[j] > arr[fraction + j];j -= fraction){
                    temp = arr[j];
                    arr[j] = arr[fraction+j];
                    arr[fraction + j] = temp;
                }
            }
        }    
        return arr;
    }
    console.log(shellSort(array));

 

 

    /*
     *归并排序
     *归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)
     *的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序
     */
     
    var array = [5,1,3,6,7,9,3,7,10,2,56,25];
    function merge(left, right){
        var result=[];
        while(left.length > 0 && right.length > 0){
            if(left[0] < right[0]){
                result.push(left.shift());
            }else{
                result.push(right.shift());
            }
        }
        return result.concat(left).concat(right);
    }
    function mergeSort(arr){
        var len = arr.length;
        if(len == 1){
            return arr;
        }
        var middle = Math.floor(len / 2),
            left = arr.slice(0, middle),
            right = arr.slice(middle);
        return merge(mergeSort(left), mergeSort(right));
    }
    
    console.log(mergeSort(array));

 

posted @ 2016-05-03 16:21  缚心  阅读(99)  评论(0)    收藏  举报