码迷,mamicode.com
首页 > 其他好文 > 详细

排序算法

时间:2014-08-31 17:05:21      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   java   strong   ar   

1、冒泡排序:从尾致头做一遍相邻元素的两两比较,将小的元素往前交换位置,一遍下来得到第一个元素为最小的,然后在剩余的n-1个元素中再进行比较,选出第二个最小的,以此类推。

不稳定、O(n²)

function bubbleSort(arr){
    var i,j,tmp,len=arr.length;
    for(i=0;i<len;i++){
        for(j=len-1;j>i;j--){
            if(arr[j]<arr[j-1]){
                tmp = arr[j];
                arr[j] = arr[j-1];
                arr[j-1] = tmp;
            }
        }
    }
    return arr;
}

2、快速排序:选取一个基准,将大于它的元素放在右边,小于它的放在左边,然后分别对左右子列进行快排。

不稳定、O(nlog2n)

方法1:该算法比较通俗易懂,但可能有性能上的问题,每次递归都创建两个新的数组,而且有人说快排应该是原地排序,该算法却返回了一个新数组。大家可以自己研究研究。    转自阮一峰的网络日志 :http://www.ruanyifeng.com/blog/2011/04/quicksort_in_javascript.html

function quickSort(arr){
    if(arr.length<=1) return arr;
    var left = [];
    var right = [];
    var pos = arr.splice(Math.floor(arr.length/2),1); 
    for(i=0;i<arr.length;i++){
        if(arr[i]<pos){
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
    }
    return quickSort(left).concat(pos,quickSort(right));
}

方法2:这是我自己的写的算法,每次递归取第一个元素为基准pivot,然后从最后j往前比较,直到arr[j]<pivot,将arr[j]的值赋给arr[i],然后从i++的位置往后比较,直到arr[i]>pivot,将arr[i]的值赋给arr[j],然后再从j--的位置往前,以此类推,直到i=j,将pivot赋给arr[i]。

function quickSort(arr,left,right){
    if(left<right){
        var pos = partition(arr,left,right);
        quickSort(arr,left,pos-1);
        quickSort(arr,pos+1,right);
    }
    function partition(arr,low,high){
        var i = low; j = high;
        var pivot = arr[i];
        while(i!=j){
            while(arr[j]>pivot && i<j){j--;}
            if(i<j){
                arr[i] = arr[j];
                i++;
            }
            while(arr[i]<pivot && i<j){i++;}
            if(i<j){
                arr[j] = arr[i];
                j--;
            }
        }
        arr[i] = pivot;
        return i;
    }
    return arr;
}
quickSort(arr,0,arr.length-1);

 

3、直接插入排序:把第一个元素当做一个有序子列,然后将后面的元素一个一个比较交换,然后插入。

稳定、O(n²)

function insertSort(arr){
    var tmp;
    for(var j=1;j<arr.length;j++){
        tmp = arr[j];
        var i = j-1;
        while(i>=0 && arr[i]>tmp){
            arr[i+1] = arr[i];
            i--;
        }
        arr[i+1] = tmp;
    }
    return arr;
}

 

4、选择排序:先选取数组中最小的元素,与第一个元素交换位置,然后再在其余n-1个元素中选取最小的元素,与第二个元素交换位置,以此类推。

不稳定、O(n²)

function selectionSort(arr){
    var tmp;
    for(var i=0;i<arr.length-1;i++){
        var k = i;
        for(var j=i+1;j<arr.length;j++){
            if(arr[j]<arr[k]){
                k=j;
            }
        }
        if(k!=i){
            tmp = arr[i];
            arr[i] = arr[k];
            arr[k] = tmp;
        }
    }
    return arr;
}

 

5、希尔排序:是插入排序的一种,又称缩小增量排序。先取一个小于n的整数gap作为第一个增量(一般是数组长度的一半),把文件的全部记录分组。所有距离为gap的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后gap/2,重复上述的分组和排序,直至所取的增量gap=1,即所有记录放在同一组中进行直接插入排序为止。

不稳定、O(nlog2n)

function shellSort(arr){
    var gap = arr.length/2;
    while(gap){
        shell(arr,gap);
        gap = Math.floor(gap/2);
    }
    
    function shell(arr,gap){
        for(var i=gap;i<arr.length;i++){
            var j = i, tmp = arr[i];
            while(j>=gap && tmp<arr[j-gap]){
                arr[j] = arr[j-gap];
                j-=gap;
            }
            arr[j] = tmp;
        }
    }
    return arr;
}

 

6、二分法插入排序:是对直接插入的一种改进,插入的时候不是从后往前一个个比较,而是采用二分法的方式查找。

稳定、O(nlog2n)

function binarySort(arr){
    for(var i=1;i<arr.length;i++){
        bs(arr,i);
        alert(arr);
    }
    function bs(arr,i){
        var left = 0, right = i-1;
        var tmp = arr[i];
        while(left<=right){
            var middle = Math.floor((left+right)/2);
            if(arr[middle]<tmp){
                left = middle+1;
            }else{
                right = middle-1;
            }
        }
        for(var k=i-1;k>=left;k--){
            arr[k+1] = arr[k];
        }
        arr[left] = tmp;
    }
    return arr;
}

 

排序算法

标签:style   blog   http   color   os   io   java   strong   ar   

原文地址:http://www.cnblogs.com/cr-smile/p/3947116.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!