排序算法總結

排序算法總結

1.幾種基本的代碼實現

冒泡排序:

 /**
     * 冒泡排序
     * @param arr 待排序數組
     * @return
     */
 public void BubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int t = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = t;
                }
            }
        }
    }

快速排序:

/**
     * 快速排序
     * @param arr   待排數組
     * @param start 下標
     * @param end   上標
     */
    public void QuickSort(int[] arr, int start, int end) {
        if (start > end)
            return;
        //下標
        int low = start;
        //上標
        int high = end;
        //基準數
        int temp = arr[start];

        while (low < high) {
            while (temp <= arr[high] && low < high)
                high--;
            while (temp >= arr[low] && low < high)
                low++;
            if (low < high) {
                int t = arr[high];
                arr[high] = arr[low];
                arr[low] = t;
            }
        }

        arr[start] = arr[low];
        arr[low] = temp;

        QuickSort(arr, start, high - 1);
        QuickSort(arr, high + 1, end);
    }

插入排序:

/**
     * 插入排序
     * @param arr 待排數組
     */
    public void InsertSort(int[] arr) {
        int len = arr.length;
        if (arr.length <= 1)
            return;
        for (int i = 1; i < len; i++) {
            int temp = arr[i];
            for (int j = 0; j < i; j++) {
                if (arr[j] > temp) {
                    int t = i;
                    while (t > j) {
                        arr[t] = arr[t - 1];
                        t--;
                    }
                    arr[j] = temp;
                    break;
                }
            }
        }
    }

選擇排序:

/**
     * 選擇排序
     * @param arr 待排數組
     */
    public void SelectSort(int[] arr) {
        int len = arr.length;
        int minindex = 0;
        for (int i = 0; i < len; i++) {
            int min = 10000000;
            for (int j = i; j < len; j++) {
                if (arr[j] < min) {
                    min = arr[j];
                    minindex = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[minindex];
            arr[minindex] = temp;
        }
    }

2.幾種基本的排序算法比較

排序算法 時間複雜度 穩定性 特點
冒泡排序 O(n2) 穩定 一般情況下,特別是在逆序時,它很不理想。它是對數據有序性非常敏感的排序算法。
插入排序 O(n2) 穩定 插入排序將要優於冒泡排序。直接插入法也是一種對數據的有序性非常敏感的一種算法。在有序情況下只需要經過n-1次比較,在最壞情況下,將需要n(n-1)/2次比較
選擇排序 O(n2) 不穩定 對數據的有序性不敏感。它雖然比較次數多,但它的數據交換量卻很少。所以我們將發現它在一般情況下將快於冒泡排序
快速排序 O(nlogn) 平均時間, O(n2) 最壞情況 不穩定 在理論上講,如果每次能均勻劃分序列,它將是最快的排序算法, 因此稱它作快速排序。雖然很難均勻劃分序列,但就平均性能而言,它仍是基於關鍵字比較的內部排序算法中速度最快者。
堆排序 O(nlogn) 不穩定 一般在小規模的序列中不合適,但對於較大的序列,將表現出優越的性能
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章