冒泡、挑選與疾速排序(js)

1.冒泡排序

1.1 冒泡排序算法的運作以下:

1.比較相鄰的元素。假如第一個比第二個大,就交流他們兩個。
2.對每一對相鄰元素作一樣的事情,從最先第一對到末端的末了一對。在這一點,末了的元素應當會是最大的數。
3.針對一切的元素反覆以上的步驟,除了末了一個。
4.延續每次對越來越少的元素反覆上面的步驟,直到沒有任何一對数字須要比較。

1.2 javaScript中的完成

    var arr = [9,8,7,6,5,4,3,2,1,0];
    
    //交流arr[i]和arr[j]
    function swap(arr,i,j){
        var temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    //冒泡排序
    function bubbleSort(arr){
        var leap = 0;
        if(arr.length==0)
            return;
        for(var i = 0 ; i < arr.length ; i++){
            leap = 0;
            for(var j = 1 ; j < arr.length ; j++){
                if(arr[j-1] > arr[j]){
                    swap(arr,j-1,j);
                    leap = 1;
                }
            }
            //假如沒有交流,即排序準確,提前完畢
            if(leap == 0){
                return;
            }
        }
        return arr;
    }

    console.log(bubbleSort(arr));  // arr = [0,1,2,3,4,5,6,7,8,9]

冒泡排序總的均勻時候複雜度為Q(n^2)。

2.挑選排序

2.1 挑選排序算法的頭腦:

輪迴arr.length次,從i=0最先,第i次輪迴將比較獲得的最小(或最大)的數與a[i]交流位置,即每次輪迴拿出最值放到其應當在的位置,而且將其踢出下次輪迴。

2.2 javaScript中的完成

//挑選排序
    function selectionSort(arr){
        var min;
        if(arr.length <= 1)
            return;

        for(var i = 0 ; i < arr.length-1 ; i++){
            min=i;
            for(var j = i+1 ; j < arr.length ; j++)
            {       
                if(arr[j] < arr[min]){
                    min = j;
                }
            }

            swap(arr,i,min);

        }
        return arr;
    }

     console.log(selectionSort(arr));  // arr = [0,1,2,3,4,5,6,7,8,9]

比較次數O(n^2),比較次數與關鍵字的初始狀況無關,總的比較次數N=(n-1)+(n-2)+…+1=n*(n-1)/2。交流次數O(n),最好狀況是,已有序,交流0次;最壞狀況交流n-1次,逆序交流n/2次。交流次數比冒泡排序少多了

3.疾速排序

3.1 疾速排序算法的運作以下:

1.找一個數,對數組舉行掃描,小於這個數的放在這個數的左邊,大於它的放在數組右邊
2.在對擺布兩側的數組離別舉行適才的操縱,直到數組長度為1時完畢。

3.2 javaScript中的完成

    //疾速排序
    function fastSort(arr,begin,end){  
        //當end <= begin時完畢遞歸
        if(end <= begin){
            return ;  
        } 

        var t = begin;
        var i = begin+1;
        var j = end;  
        var v = arr[begin]; 

        while (i <= j){  
            //經由過程選定的軸和厥後一個值舉行比較,如后一個值比他小則交流而且兩個同時加一而且再比較,如比他大則a[i]和a[j]舉行交流而且再比較a[begin]和a[i]的值
            if  (arr[i] <= v){  
                swap(arr, t++, i++); 
           
            }else if(arr[i] > v){  
                swap(arr, i, j--);  
            
            }
           
        }
        fastSort(arr, begin, t-1);  
        fastSort(arr, j+1, end);  
    }  
   
    fastSort(arr,0,arr.length-1);
    console.log(arr);  //arr = [0,1,2,3,4,5,6,7,8,9]

此疾速排序是優化過的,可否再優化今後再試試看。

以上代碼有部份是自創的,若有不足請指教^_^

    原文作者:yuan
    原文地址: https://segmentfault.com/a/1190000014736235
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞