冒泡、選擇與快速排序(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)。java


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]

此快速排序是優化過的,可否再優化之後再試試看。數組


以上代碼有部分是借鑑的,若有不足請指教^_^
相關文章
相關標籤/搜索