1. 程式人生 > >排序上篇(選擇排序,氣泡排序,插入排序,希爾排序)

排序上篇(選擇排序,氣泡排序,插入排序,希爾排序)

1.選擇排序

(1)原理:

 在要排序的一組數中,用第一個數與後面的數依次進行判斷,若大於後面的則進行交換;然後依次再用第二個數與後面的數進行交換,如此迴圈到倒數第二個數和最後一個數比較為止。

2圖解

內層第一次迴圈如下:

 

外層控制迴圈次數:

  1. 程式碼

  public static void selectSort(int[] arr) {

        for (int i = 0; i < arr.length - 1; i++) {   //使用巢狀迴圈,注意迴圈次數為陣列長度減1

            for (int j = i + 1; j < arr.length; j++) {

                if (arr[i] > arr[j]) {

                    int temp = arr[i];

                    arr[i] = arr[j];

                    arr[j] = temp;

                }

            }

       

        }

    }

2.冒泡排序

(1)原理:

 在要排序的一組數中,從頭開始用相鄰的兩個數依次進行比較,若第一個數大則調換位置,就這樣讓較大的數往下沉,較小的往上冒。如此迴圈到倒數第二個數和最後一個數比較為止。

2圖解

 

3程式碼

public static void bubbleSort(int[] arr){

        for (int i = 0; i < arr.length-1; i++) {  //外層迴圈確定迴圈次數:陣列長度減1

            for (int j = 0; j < arr.length-1-i; j++) {//內層迴圈比較相鄰的元素,注意迴圈長度隨著確定個數遞減

                if (arr[j] > arr[j + 1]) {

                    int tem = arr[j];

                    arr[j] = arr[j + 1];

                    arr[j + 1] = tem;

                }

            }

        }

 

}

 

3.插入排序

(1)原理:

在要排序的一組數中,先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。

2圖解下圖黑色方框為排好序的,有下劃線是需要進行排序的數字,箭頭為插入的位置

3程式碼

 

 public  static void inserSort(int[] arr){

        for (int i = 1; i < arr.length; i++) {

            int j;

            int num=arr[i];

            for ( j=i;j>0&&arr[j-1]>num;j--){ 

                arr[j]=arr[j-1];

            }

            arr[j]=num;

        }

 

    }

4.希爾排序

(1)原理:

在要排序的一組數中,先將整個待排序的記錄序列按某個增量d(n/2,n為要排序數的個數)分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。

  1. 圖解

3程式碼

 public static void shellSort1(int[] arr) {

        int dk = arr.length/2;

        while( dk >= 1  ){

            ShellSort2(arr, dk);

            dk = dk/2;

        }

    }

    private static void ShellSort2(int[] a, int dk) {//類似插入排序,只是插入排序增量是1,這裡增量是dk,把1換成dk就可以了

        for(int i=dk;i<a.length;i++){

            if(a[i]<a[i-dk]){

                int j;

                int x=a[i];//x為待插入元素

                a[i]=a[i-dk];

                for(j=i-dk;  j>=0 && x<a[j];j=j-dk){//通過迴圈,逐個後移一位找到要插入的位置。

                    a[j+dk]=a[j];

                }

                a[j+dk]=x;//插入

            }

                  }

 

    }