歸併排序演算法-Java實現

來源:互聯網
上載者:User

標籤:演算法   length   string   複雜度   記憶體   空間   申請   size   color   

簡介:

      歸併(Merge)排序法是將兩個(或兩個以上)有序表合并成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合并為整體有序

基本思想:

      將一個無序數組,利用遞迴和分治的方法劃分為最小半子集,最終劃分為完全二叉樹。然後對半子集進行排序並進行遞迴合并到最後。

複雜度分析

     時間複雜度為O(nlogn)      

   空間複雜度為O(n+logn)      

   兩兩比較,不存在跳躍,因此歸併排序是一種穩定的排序演算法    

   歸併排序是一種比較占記憶體,但卻效率高且穩定的演算法

工作原理

(1)申請空間,大小為兩個半子集大小的空間,用來存放兩個半子集排序合并後的資料
(2)設定兩個指標,最初位置分別為兩個半子集的起始位置
(3)比較兩個指標所指向的元素,選擇相對小的元素放入到合并空間,並移動指標到下一位置
(4)重複步驟3直到某一指標達到序列尾 
(5)將另一序列剩下的所有元素直接複製到定序序列尾

排序過程詳解:

   以執行個體:12,4,13,25,92,11,9,3,2 進行排序

  

 排序結果:2,3,4,9,11,12,13,25,92

具體代碼如下:

package com.chengxuyuanzhilu.one;import java.util.Arrays;public class MergeSort {    public static int[] sort(int[] nums, int low, int high) {          int mid = (low + high) / 2;          if (low < high) {              // 左邊              sort(nums, low, mid);              // 右邊              sort(nums, mid + 1, high);              // 左右歸併              merge(nums, low, mid, high);          }          return nums;      }        public static void merge(int[] nums, int low, int mid, int high) {          int[] temp = new int[high - low + 1];          int i = low;// 左指標          int j = mid + 1;// 右指標          int k = 0;            // 把較小的數先移到新數組中          while (i <= mid && j <= high) {              if (nums[i] <= nums[j]) {                  temp[k++] = nums[i++];              } else {                  temp[k++] = nums[j++];              }          }            // 把左邊剩餘的數移入數組          while (i <= mid) {              temp[k++] = nums[i++];          }            // 把右邊邊剩餘的數移入數組          while (j <= high) {              temp[k++] = nums[j++];          }            // 把新數組中的數覆蓋nums數組          for (int k2 = 0; k2 < temp.length; k2++) {              nums[k2 + low] = temp[k2];          }      }              // 歸併排序的實現      public static void main(String[] args) {                  int[] nums = {12,4,13,25,92,11,9,3,2};          MergeSort.sort(nums, 0, nums.length-1);          System.out.println(Arrays.toString(nums));      }  }  

 原文地址:http://guangboyuan.cn/archives/50

歸併排序演算法-Java實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.