1. 程式人生 > >快速排序,選擇排序,氣泡排序

快速排序,選擇排序,氣泡排序

一。快速排序

  1. 從數列中選取一個數作為基數用於比較,記為cardinal
  2. 將大於cardinal的數全部放在右邊,將小於cardinal的數全部放在左邊,進行分割槽
  3. 再對左右兩邊的分割槽重複進行第二步,直到分割槽只有一個數

快速排序是基於分治策略的,分治策略常用的解決方法就是二分法,遞迴解決


上面用圖走了一遍第一次快速排序,這種方法是左右交換的辦法比較實用,還有挖坑填值法,可以自去看看,下面是java程式碼的實現

public static void quickSort2(int[] num,int left,int right){
        if(left<right){
            int port = num[left];
            int L = left+1;
            int R = right;
            while(L<=R){
                /*從右邊找比基數小的數*/
                while(L<=R && num[R]>port)R--;
                /*左邊開始找 比基數大的值*/
                while(L<=R && num[L]<=port)L++;
                /*當找到兩個符合條件的數,交換兩個數*/
                if(L<R){
                    int temp = num[L];
                    num[L] = num[R];
                    num[R] = temp;
                    /*越過這兩個數,以為已經比較替換了*/
                    L++;
                    R--;
                }
            }
            /*當找不到同時符合兩個條件的數的時候,把此時右邊的數和基數替換*/
            int temp = num[R];
            num[R] = port;
            num[left] = temp;
            /*遞迴排序左邊和右邊的*/
            quickSort2(num,R+1,right);
            quickSort2(num,left,R-1);
        }
    }

二。氣泡排序

  1.     氣泡排序:如果升序,左邊第一個數和剩餘的數比較一發現有比自己小的馬上交換,依次執行
/**
         * 氣泡排序
         * 每一次找出剩下最大的放在後面
         *時間複雜度為O(n^2)
         */
        for(int i=num.length-1; i>=0; i--){
            for(int j=i-1; j>=0 ; j-- ){
                /*找到比自己大的馬上交換*/
                if(num[i]<num[j]){
                    int temp = num[i];
                    num[i] = num[j];
                    num[j] = temp;
                }
            }
        }
2.選擇排序,相當於冒泡的修改一點,每次找出最大或者最小的數再交換。
for(int i=num.length-1; i>=0; i--){
            int max = i;
            for(int j=i-1; j>=0 ; j-- ){
                /*發現有比自己大的數,記錄小這個數的位置*/
                if(num[max]<num[j]){
                    max = j;
                }
            }
            /*一輪下來發現最大的數不是自己,就交換位置*/
            if(i != max){
                int temp = num[i];
                num[i] = num[max];
                num[max] = temp;
            }
        }