1. 程式人生 > >【知了堂學習筆記】java 編寫幾種常見排序算法

【知了堂學習筆記】java 編寫幾種常見排序算法

第一個 public 調用 ati print 所有 eth string quick

排序的分類:

技術分享

一.交換排序

所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。

1.冒泡排序

算法原理

冒泡排序算法的運作如下:
  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對所有的元素重復以上的步驟,除了最後一個。
  4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

java代碼的實現:

package Sort;

import
java.util.Scanner; public class BubbleSort { /** * 冒泡排序算法的運作如下: 1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 3.針對所有的元素重復以上的步驟,除了最後一個。 4.持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較. * @param args */ public static void
main(String[] args) { // TODO Auto-generated method stub int[] arr = {78,68,48,39,95,48,94,73}; for(int i=0;i<arr.length;i++){//實現多次全部交換 for(int j=0;j<arr.length-1;j++){//實現一次所有交換,且每次都將選出最大的數字放在最後 if(arr[j]>arr[j+1]){ arr[j]=arr[j]^arr[j+1]; arr[j
+1]=arr[j]^arr[j+1]; arr[j]=arr[j]^arr[j+1]; } } for(int m=0;m<arr.length;m++){//輸出每次交換後的數組 System.out.print(arr[m]+" "); } System.out.println(); } for(int num:arr){//輸出最後一次交換完成的數組 System.out.print(num+" "); } } }

2.快速排序:

算法原理

快速排序算法的運作如下:

快速排序(Quicksort)是對冒泡排序的一種改進。

1設置兩個變量i、j,排序開始的時候:i=0,j=arr.length-1;
2以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];
3從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換;
4從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;
5重復第3、4步,直到i<j不成立。

java代碼的實現:

package Sort;

public class QuickSort {
    /**
     * 1)設置兩個變量i、j,排序開始的時候:i=0,j=arr.length-1;
     * 2)以第一個數組元素作為關鍵數據,賦值給,temp即=A[0];
     * 3)從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值arr[j],將arr[j]和arr[i]互換;
     * 4)從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的arr[i],將arr[i]和arr[j]互換;
     * 5)重復第3、4步,直到i<j不成立。
     * 
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr = { 78, 68, 48, 39, 95, 48, 94, 73 };
        sort(arr, 0, arr.length - 1);
        for (int m = 0; m < arr.length; m++) {
            System.out.print(arr[m]+" ");
        }
    }

    public static void sort(int[] arr, int a, int b) {
        int i=a,j=b;//將a,b的值賦給i,j目的是保留a,b。
        int temp = arr[i];//獲取關鍵數據
        while (i < j) {
            while (i < j && arr[j] >= temp) {//當後面的數字比關鍵數字大的時候位置不交換,
                                             //執行j--然後arr【j】前面的數字與temp比較
                j--;
            }
            while (arr[j] < temp) {//當後面的數字比關鍵數字小的時候位置交換。
                arr[i] = arr[j] ^ arr[i];
                arr[j] = arr[j] ^ arr[i];
                arr[i] = arr[j] ^ arr[i];
            }
            //當位置交換後比較的數據也從後到前,變為從前到後
            while (i < j && arr[i] <= temp) {//當前面的數字比關鍵數字小的時候位置不交換,
                                              //執行i++然後arr【i】後面的數字與temp比較
                i++;
            }
            while (arr[i] > temp) {//當前面的數字比關鍵數字小的時候位置交換。
                arr[j] = arr[j] ^ arr[i];
                arr[i] = arr[j] ^ arr[i];
                arr[j] = arr[j] ^ arr[i];
            }
        }
        //第一輪選則出來後獲取到當前i的值由i出將數組分為兩段,前後各自重復執行sort()方法,直到i<j不成立。遞歸的調用
        if (i > a) {//前面部分
            sort(arr, a, i - 1);
        }
        if (j < b) {//後面部分
            sort(arr, j + 1, b);
        }
    }
}

未完待續.....

http://www.zhiliaotang.com 請關註知了堂,在這裏將會有更多學習夥伴一起共同進步.。

【知了堂學習筆記】java 編寫幾種常見排序算法