演算法--陣列氣泡排序和選擇排序原理分析

Java仗劍走天涯發表於2017-06-02

1.氣泡排序原理分析

1.1氣泡排序

從前往後後依次比較相鄰兩個元素大小,大的元素往後挪,比較完第一遍後,最大的元素排到了陣列的最後一位(假設是從小到大排序)


1.2原理分析:

氣泡排序邏輯:若為從小到大排序

  • 第一個數與第二個數比較 - - 若第二個數大,則不交換位置,反之,交換位置
  • 根據上一步的結果:進行第二個數與第三個數比較 - - 若第三個數大,則不交換位置,反之,交換位置
  • 依次類推,完成與最後一個數的比較後,最大的數就被排到了末位。
  • 接著再排依照同樣的方法,將第二大的數排在倒數第二位(注意:排好了的數,就不需要再與他們比較大小了)

圖解原理

這裡寫圖片描述


1.3程式碼實現

package 陣列兩種排序;

import java.util.Arrays;

//氣泡排序
public class Test1 {
    public static void main(String[] args) {
        int[] arr={2,5,1,9,12,6,7};
        bubbleSort(arr);
        System.out.println("從小到大排序"+Arrays.toString(arr));

        bubbleSort2(arr);
        System.out.println("從大到小排序"+Arrays.toString(arr));
    }

    //1.氣泡排序--從小到大排序
    public static int[] bubbleSort(int[] arr){
        for (int i = 0; i < arr.length-1; i++) {
            //對於已經排好的元素就不用再做比較了,所以第二個for迴圈,值遍歷到arr.length-i-1
            for (int j = 0; j < arr.length-i-1; j++) {
                //相鄰兩數比較,前面的數大,則交換,否則不交換,這樣迴圈完後,最大值被排到了最後一位
                if(arr[j]>arr[j+1]){
                    int temp=arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return arr;
    }

    //2.氣泡排序--從大到小排序    只是將if判斷中大於號>,改為了小於號<
    public static int[] bubbleSort2(int[] arr){
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length-i-1; j++) {
                if(arr[j]<arr[j+1]){
                    int temp=arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return arr;
    }


}

2.選擇排序原理分析

2.1選擇排序:

在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止(假設為從小到大排序)


2.2原理分析

選擇排序邏輯:若為從小到大排序

  • 第一次:對陣列中所有數值進行比較,獲得最小值下標,然後將最小值與第一個數交換
  • 第二次:對陣列中剩餘(除第一個數)數值進行比較,獲得最小值下標,然後將最小值與第二個數交換
  • 依次類推,直至確定倒數第二個位置的數值

圖解原理

這裡寫圖片描述


2.3程式碼實現

package 陣列兩種排序;

import java.util.Arrays;

public class Test2 {
    public static void main(String[] args) {
        int[] arr = { 2, 5, 1, 9, 12, 6, 7 };
        chooseSort(arr);
        System.out.println("從小到大排序" + Arrays.toString(arr));

        chooseSort2(arr);
        System.out.println("從大到小排序" + Arrays.toString(arr));
    }

    // 1.選擇排序--從小到大排序
    public static int[] chooseSort(int[] arr) {
        //遍歷陣列,獲取指定的arr[i]去與
        for (int i = 0; i < arr.length - 1; i++) {
            int index = i;//儲存最小值的下標
            for (int j = i + 1; j < arr.length; j++) {
                //若arr[index]大,則改變索引,使arr[index]變為那個小的值,最後可以得到最小值的索引
                if (arr[index] > arr[j]) {
                    index = j;
                }
            }

            //若index和初始值i相同就沒必要交換了
            if(index!=i){
                //將最小值與arr[i]交換
                int temp2 = arr[i];
                arr[i] = arr[index];
                arr[index] = temp2;
            }

        }
        return arr;
    }

    // 2.選擇排序--從大到小排序   只是將if判斷中大於號>,改為了小於號<
    public static int[] chooseSort2(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int index = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[index] < arr[j]) {
                    index = j;
                }
            }

            if(index!=i){
                //將最小值與arr[i]交換
                int temp2 = arr[i];
                arr[i] = arr[index];
                arr[index] = temp2;
            }
        }
        return arr;
    }
}

3.兩種排序方式的比較

3.1氣泡排序

交換次數多,耗時耗資源

3.2選擇排序

交換次數少,節省時間和資源

相關文章