歸并排序 --- Java版

算法思路

mergeSort.jpg
  1. 把待排序List中間切分成2段,而且是遞歸切分,直到子List元素只有1個(gè)結(jié)束。
  2. 把切分好的子List,進(jìn)行按照大小進(jìn)行排序merge,合成一個(gè)List。
  3. 重復(fù)這個(gè)過程,直到形成一個(gè)完整的排序好的List。


算法實(shí)現(xiàn)

class TestClass {
    public static void main(String args[] ) throws Exception {
        /* Sample code to perform I/O:
         * Use either of these methods for input

        //BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String name = br.readLine();                // Reading input from STDIN
        System.out.println("Hi, " + name + ".");    // Writing output to STDOUT

        //Scanner
        Scanner s = new Scanner(System.in);
        String name = s.nextLine();                 // Reading input from STDIN
        System.out.println("Hi, " + name + ".");    // Writing output to STDOUT

        */

        // Write your code here
        Scanner s = new Scanner(System.in);
        int n = s.nextInt();                 // Reading input from STDIN
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = s.nextInt();
        }
        
        mergeSort(a, 0, n - 1);
        for (int i = 0; i < n; i++) {
            System.out.printf("%d ", a[i]);
        }
    }
    
    private static void mergeSort(int[] a, int low, int high) {
        if (low >= high) {
            return;
        }
        
        int mid = low + (high - low) / 2;
        mergeSort(a, low, mid);
        mergeSort(a, mid + 1, high);
        
        merge(a, low, mid, high);
    }
    
   private static void merge(int[] a, int low, int mid, int high) {

        int[] nums = new int[high - low + 1];
        // 合并的第一個(gè)數(shù)組起始位置p
        // 合并的第二個(gè)數(shù)組起始位置q
        int p = low, q = mid + 1;
        int index = 0;
        while (p <= mid && q <= high) {
            if (a[p] < a[q]) {
                nums[index++] = a[p++];
            } else {
                nums[index++] = a[q++];
            }
        }

        while (p <= mid) {
            nums[index++] = a[p++];
        }

        while (q <= high) {
            nums[index++] = a[q++];
        }

        System.arraycopy(nums, 0, a, low, high - low + 1);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容