1. 程式人生 > >排序演算法筆記

排序演算法筆記

簡單排序

直接選擇排序

示例資料:25 , 89 , 72 , 15 , 32 , 10 , 8 , 64 先中找到最小數(或最大數),即8將與資料第一位交換形成一個新的順序資料 8,89,72,15,32,10,25,64,這時資料8已經是排好的資料了,不在下一趟選擇最小資料的範圍內,下一趟從89,72,15,32,10,25,64中選擇最小資料,如此迴圈,順序變換如下:

[ 25 , 89 , 72 , 15 , 32 , 10 , 8 , 64 ]

8 , [ 89 , 72 , 15 , 32 , 10 , 25 , 64 ]

8 , 10 , [ 72 , 15 , 32 , 89 , 25 , 64 ]

8 , 10 , 15 , [ 72 , 32 , 89 , 25 , 64 ]

8 , 10 , 15 , 25 , [ 32 , 89 , 72 , 64 ]

8 , 10 , 15 , 25 , 32 , [ 89 , 72 , 64 ]

8 , 10 , 15 , 25 , 32 , 64 , [ 72 , 89 ]

8 , 10 , 15 , 25 , 32 , 64 , 72 , [ 89 ]

程式碼示例:

/**
     * 簡單選擇排序
     *
     * @param arr
     */
    public static void selectSort(int[] arr)
{ for (int i = 0; i < arr.length - 1; i++) { int min = i;//每一趟迴圈比較時,min用於存放較小元素的陣列下標,這樣當前批次比較完畢最終存放的就是此趟內最小的元素的下標,避免每次遇到較小元素都要進行交換。 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[min]) { min = j; }
} //進行交換,如果min發生變化,則進行交換 if (min != i) { swap(arr,min,i); } } } public void swap(int arr[],int min,int i){ int tmp = arr[min]; arr[min] = arr[i]; arr[i] = tmp; }

氣泡排序

氣泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素“浮”到頂端,最終達到完全有序 在這裡插入圖片描述 程式碼示例:

/**
     * 氣泡排序
     *
     * @param arr
     */
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = true;//設定一個標記,若為true,則表示此次迴圈沒有進行交換,也就是待排序列已經有序,排序已然完成。
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr,j,j+1);
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
    }

直接插入排序

直接插入排序基本思想是每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。 在這裡插入圖片描述

程式碼示例:

 /**
     * 插入排序
     *
     * @param arr
     */
    public static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int j = i;
            while (j > 0 && arr[j] < arr[j - 1]) {
                swap(arr,j,j-1);
                j--;
            }
        }
    }