數據結構與算法之基礎排序(冒泡/插入/選擇)

先介紹基礎的排序方法

1.冒泡排序
    冒泡排序是一種簡單的排序算法 其基本思路就是迭代對輸入序列的第一個元素到最後一個元素進行兩兩比較。
    優點
        可以檢測已排序序列
        實現簡單 
    缺點 
        速度太慢O(n^2)
    算法 
        1.兩兩相比較 若大於或小於則替換
        2.重複上述過程 遍歷序列

2.選擇排序
    選擇排序是一種原地算法,也就是不需要額外的空間,適用於小文件
    優點 
        容易實現
        原地排序
    缺點
        速度太慢O(n^2)
    算法
        1.尋找序列中的最小或最大值
        2.與當前位置的值交換
        3.重複上述過程,遍歷序列 

插入排序
    插入排序是一種簡單有效的排序算法。每次迭代過程中算法隨機的重輸入序列中移除一個元素並將其插入到正確的位置。
    優點 
        實現簡單
        數據小效率高 
        效率略優於冒泡和插入 
        穩定性高
        原地 經需要少量的輔助空間 
    缺點
        效率依然很慢
    算法 
        每次移除一個元素將其插入到一個已經排序好的數組中 

算法實現
以下實現可能有錯誤,僅供參考

冒泡排序

// 冒泡排序
    public void sortByBubble(int[] arr) {
        int temp;
        //遍歷序列
        for (int i = 0; i < arr.length; i++) {
            //兩兩比較 每次選出一個最大值到序列末尾
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

選擇排序


    // 獲取數組最小值
    public int minIndex(int[] arr, int start) {
        for (int i = start; i < arr.length; i++) {
            if (arr[i] < arr[start]) {
                start = i;
            }
        }
        return start;
    }

    // 簡單選擇排序
    public void sortBysimpleSel() {
        int index;
        for (int i = 0; i < arr.length; i++) {
            //找出最小值
            index = minIndex(arr, i);
            //最小值與當前位置替換
            int temp = arr[i];
            arr[i] = arr[index];
            arr[index] = temp;
        }
    }

插入排序

public void sortByInsert(int[] array) {
        // 插入排序 
        //保證此位置之前的序列是已經排好序的
        // 每次從輸入的數據中移除一個元素將其插入已經排好序的序列中
        // 所以當遍歷一遍元素便排好了序列

        // 從第二個開始 
        int j = 0;
        for (int i = 1; i < array.length; i++) {
            //將需要插入的數據保存
            int temp = array[i];
            j = i;
            // 從此位置開始向前尋找(前面的序列已經排好序了)  直到找到比array[i]小的位置或者到頭
            while (j >= 1 && array[j - 1] > temp) {
                // 如果array[j-1]比array[i]大則後移,空出位置
                array[j] = array[j - 1];
                j--;
            }
            //找到位置或者到了序列頭
            array[j] = temp;
        }

到此基礎排序的講解到此結束。

下一篇 數據結構與算法之高級排序(希爾/堆)<十一>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章