日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法】归并排序

發布時間:2025/6/17 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法】归并排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

算法 系列博客

【算法】刷題范圍建議 和 代碼規范
【算法】復雜度理論 ( 時間復雜度 )

【字符串】最長回文子串 ( 蠻力算法 )
【字符串】最長回文子串 ( 中心線枚舉算法 )
【字符串】最長回文子串 ( 動態規劃算法 ) ★
【字符串】字符串查找 ( 蠻力算法 )
【字符串】字符串查找 ( Rabin-Karp 算法 )

【算法】雙指針算法 ( 雙指針算法分類 | 相向雙指針 | 有效回文串 )
【算法】雙指針算法 ( 有效回文串 II )
【算法】哈希表 ( 兩數之和 )

【算法】快速排序
【算法】歸并排序


文章目錄

  • 算法 系列博客
  • 一、歸并排序





一、歸并排序



歸并排序 : https://www.lintcode.com/problem/463



歸并排序原理 :

歸并排序 先分割為兩部分 , 然后兩邊分別排序 , 再進行合并 ;
先局部有序 , 后整體有序 ;

歸并排序 與 快速排序 比較 , 其比 快排 多花費 O(n)O(n)O(n) 的空間 , 其合并兩個數組時 , 不能在原數組中進行 ;
快速排序 , 始終都在原數組中進行 , 只涉及到交換數組中的元素 ;

正式由于該額外數組的存在 , 因此歸并排序 , 并不是排序的最優算法 ;


算法要點 :

合并數組中 , 創建數組的時機 , 不要放在遞歸中 , 遞歸要調用很多次 , 頻繁創建銷毀數組 , 很耗費時間和空間 ;


代碼示例 :

class Solution {/*** 歸并排序* @param A*/public void sortIntegers(int[] A) {if (A == null || A.length == 0) {return;}// 用于合并數組的額外空間int mergeArray[] = new int[A.length];// 遞歸調用排序算法mergeSort(A, 0, A.length - 1, mergeArray);}// 將 array 數組中 start 到 end 之間的元素進行排序private void mergeSort(int[] array, int start, int end, int[] mergeArray) {if (start >= end) {// start 如果等于 end, 說明就一個元素, 不用排序// start 正常情況下不會大于 endreturn;}// 先在中間切一刀, 左側右側進行分別排序// 左側排序mergeSort(array, start, (start + end) / 2, mergeArray);// 右側排序mergeSort(array, (start + end) / 2 + 1, end, mergeArray);// 進行歸并操作, 將已經排好序的兩側的數組進行合并merge(array, start, end, mergeArray);}// 合并兩個已經排好序的數組private void merge(int[] array, int start, int end, int[] mergeArray) {// 左右兩個數組的遍歷索引, 初值值為左右兩側的開始索引int leftIndex = start;int rightIndex = (start + end) / 2 + 1;// 記錄 mergeArray 的賦值索引int mergeIndex = leftIndex;while (leftIndex <= (start + end) / 2 && rightIndex <= end) {if (array[leftIndex] < array[rightIndex]){// 先賦值, 然后索引自增mergeArray[mergeIndex++] = array[leftIndex++];} else {mergeArray[mergeIndex++] = array[rightIndex++];}}// 上述賦值完畢后, 可能有一側還有若干元素沒有賦值完畢// 檢查左側是否賦值完畢, 如果沒有賦值完畢, 則繼續遍歷, 如果賦值完畢, 則不會進入循環while (leftIndex <= (start + end) / 2) {mergeArray[mergeIndex++] = array[leftIndex++];}// 檢查右側是否賦值完畢, 如果沒有賦值完畢, 則繼續遍歷, 如果賦值完畢, 則不會進入循環while (rightIndex <= end) {mergeArray[mergeIndex++] = array[rightIndex++];}// 上述操作將排序號的元素都放在 mergeArray 數組中, 在將其設置到 array 數組中for (int i = start; i <= end; i++) {array[i] = mergeArray[i];}} }

總結

以上是生活随笔為你收集整理的【算法】归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。