自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java編程內功-數(shù)據(jù)結構與算法「歸并排序」

開發(fā) 后端 算法
歸并排序(merge-sort)是利用歸并的思想實現(xiàn)的排序方法,該算法采用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的答案"修補"在一起,即分而治之).

[[393503]]

基本介紹

歸并排序(merge-sort)是利用歸并的思想實現(xiàn)的排序方法,該算法采用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的答案"修補"在一起,即分而治之).

示意圖

說明:可以看到這種結構很像一顆完全二叉樹,本文的歸并排序我們采用遞歸去實現(xiàn)(也可以采用迭代的方式去實現(xiàn)).分階段可以理解為就是遞歸拆分子序列的過程.

再來看看治階段,我們需要將兩個已經有序的子序列合并成一個有序序列,比如下圖的最有一次合并,要將[4,5,7,8]和[1,2,3,6]兩個已經有序的子序列,合并為最終序列[1,2,3,4,5,6,7,8],來看下實現(xiàn)步驟.

代碼示例

  1. package com.structures.sort; 
  2.  
  3. blic class MergeSort { 
  4.   public static void main(String[] args) { 
  5.       int[] arr = new int[80000]; 
  6.       for (int i = 0; i < 80000; i++) { 
  7.           arr[i] = (int) (Math.random() * 8000000); 
  8.       } 
  9.       int[] temp = new int[arr.length]; 
  10.       long start = System.currentTimeMillis(); 
  11.  
  12.       mergeSort(arr,0,arr.length-1,temp); 
  13.       long end = System.currentTimeMillis(); 
  14.       System.out.println("耗時:" + ((end - start)) + "ms"); 
  15.       /* 
  16.       耗時:15ms 
  17.        */ 
  18.   } 
  19.  
  20.   //分+合 
  21.   public static void mergeSort(int[] arr, int leftint rightint[] temp) { 
  22.       if (left < right) { 
  23.           int mid = (left + right) / 2; 
  24.           //向左遞歸進行分解 
  25.           mergeSort(arr, left, mid, temp); 
  26.           //向右遞歸進行分解 
  27.           mergeSort(arr, mid + 1, righttemp); 
  28.           //合并 
  29.           merge(arr, left, mid, righttemp); 
  30.       } 
  31.   } 
  32.  
  33.   /** 
  34.    * 合并 
  35.    * @param arr   已排序的原始數(shù)組 
  36.    * @param left  左邊有序序列的初始索引 
  37.    * @param mid   中間索引 
  38.    * @param right 右邊索引 
  39.    * @param temp  做中轉數(shù)組 
  40.    */ 
  41.   public static void merge(int[] arr, int leftint mid, int rightint[] temp) { 
  42.       int i = left;//初始化i,左邊有序序列的初始索引 
  43.       int j = mid + 1;//初始化j,右邊有序序列的初始索引 
  44.       int t = 0;//指向temp數(shù)組的當前索引 
  45.  
  46.       //(一) 
  47.       //先把左右兩邊(有序)的數(shù)據(jù)按照規(guī)則填充到temp數(shù)組 
  48.       //直到左右兩邊的有序序列,有一邊處理完畢為止,即全部填充到temp數(shù)組 
  49.       while (i <= mid && j <= right) { 
  50.           //如果左邊的有序序列小于等于右邊的有序序列的當前元素 
  51.           //即將左邊的當前元素拷貝到temp數(shù)組 
  52.           //然后t++,i++后移 
  53.           if (arr[i] <= arr[j]) { 
  54.               temp[t] = arr[i]; 
  55.               t += 1; 
  56.               i += 1; 
  57.           } else {//反之,將右邊有序序列的當前元素,填充到temp數(shù)組 
  58.               temp[t] = arr[j]; 
  59.               t += 1; 
  60.               j += 1; 
  61.           } 
  62.       } 
  63.  
  64.       //(二) 
  65.       //把有剩余數(shù)據(jù)的一邊的數(shù)據(jù)依次填充到temp 
  66.       while (i <= mid) {//左邊的還有剩余,填充到temp數(shù)組 
  67.           temp[t] = arr[i]; 
  68.           t += 1; 
  69.           i += 1; 
  70.       } 
  71.       while (j <= right) { 
  72.           temp[t] = arr[j]; 
  73.           t += 1; 
  74.           j += 1; 
  75.       } 
  76.  
  77.       //(三) 
  78.       //將temp數(shù)組的元素拷貝到arr 
  79.       //注意并不是每次都拷貝所有 
  80.       //第一次合并leftTemp = 0,right = 1,第二次合并leftTemp = 2,right = 3,第三次合并leftTemp = 0,right = 3... 
  81.       t = 0; 
  82.       int leftTemp = left
  83.       while (leftTemp <= right) { 
  84.           arr[leftTemp] = temp[t]; 
  85.           leftTemp += 1; 
  86.           t += 1; 
  87.       } 
  88.   } 

 【編輯推薦】

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-03-23 08:33:22

Java數(shù)據(jù)結構算法

2021-04-22 10:07:45

Java數(shù)據(jù)結構算法

2021-04-15 09:36:44

Java數(shù)據(jù)結構算法

2021-05-12 09:07:09

Java數(shù)據(jù)結構算法

2021-04-13 09:37:41

Java數(shù)據(jù)結構算法

2021-03-09 06:30:32

JAVA數(shù)據(jù)結構算法

2021-03-18 08:44:20

Java數(shù)據(jù)結構算法

2021-03-26 08:40:28

Java數(shù)據(jù)結構算法

2021-03-12 09:13:47

Java數(shù)據(jù)結構算法

2021-03-17 09:27:36

Java數(shù)據(jù)結構算法

2021-03-10 08:42:19

Java數(shù)據(jù)結構算法

2021-03-08 06:28:57

JAVA數(shù)據(jù)結構與算法稀疏數(shù)組

2021-04-07 09:26:37

Java數(shù)據(jù)結構算法

2021-03-29 10:13:47

Java編程數(shù)據(jù)結構算法

2021-03-14 08:27:40

Java數(shù)據(jù)結構算法

2021-04-23 09:12:09

Java數(shù)據(jù)結構算法

2021-03-11 08:53:20

Java數(shù)據(jù)結構算法

2023-03-08 08:03:09

數(shù)據(jù)結構算法歸并排序

2021-05-13 07:34:56

Java數(shù)據(jù)結構算法

2021-03-24 10:41:04

Java數(shù)據(jù)結構算法
點贊
收藏

51CTO技術棧公眾號