老生常談比較排序之歸併排序 遞迴

2022-10-04 05:33:14 字數 2647 閱讀 6343

歸併排序裡運用到演算法裡很重要的乙個思想——分治法:將原問題分解為幾個規模較小但r**tyo類似於原問題的子問題——《演算法導論》。

在每一層遞迴中都有3個步驟:

1.分解問題

2.解決問題

3.合併問題的解

舉例待排序陣列:,將它原始序列做分解。

可以經過不斷的遞迴分解可以看到已經把原始陣列序列不斷分解為最小單位,接下來不妨將它們看做是二叉樹的葉子節點。

將他們進行兩兩歸併排序形成二叉樹(也稱為2路歸併演算法),可見二叉樹的根節點即為最終序列。在這個過程中我們完成了剩餘的兩個步驟:解決問題和合併問題。

理論很簡單,實踐很「複雜」。對於歸併排序的理論從上面的二叉樹就看的很明白,將原始待排序陣列不斷分解最後看成是二叉樹的葉子節點,再把它們兩兩排形成新的節點,逐漸歸併為乙個節點,此時的節點即為排好序的陣列序列。

j**a

package com.algorithm.sort.merge;

import j**a.util.arrays;

/** * 歸併排序(遞迴)

* created by yulinfeng on 2017/6/23.

*/public class merge ;

nums = mergesort(nums);

system.out.println(arrays.tostring(nums));

} /**

* 歸併排序

* @param nums 待排序陣列序列

* @return 排好序的陣列序列

*/private static int mergesort(int nums)

/*** 遞迴切分待排

* @param nums 待切分陣列

* @param left 待切分最後第乙個元素的索引

* @param right 待切分陣列最後乙個元素的索引

*/private static v程式設計客棧oid segment(int nums, int left, int right)

/*** 兩兩歸併排好序的陣列(2路歸併)

* @param nums 帶排序陣列物件

* @param left 左邊陣列的第乙個索引

* @param center 左陣列的最後乙個索引,center + 1右陣列的第乙個索引

* @param right 右陣列的最後乙個索引

*/private static void merge(int nums, int left, int center, int right) else

}while (left <= center)

while (rightindex

while (begin <= right)

}}python3

#二路歸併排序(遞迴)

def merge_sort(nums):

segment(nums, 0, len(nums) - 1)

return nums

#切分待排序陣列

def segment(nums, left, right):

if left >= right:

return

center = int((left + right) / 2)

segment(nums, left, center)

segment(nums, center + 1, right)

merge(nums,r**tyo left, center, right)

#兩兩歸併排好序的陣列(二路歸併)

def merge(nums, left, center, right):

tmparra程式設計客棧y = [0] * len(nums)

rightindex = center + 1 #右陣列的第乙個元素索引

tmpindex = left

begin = left

while left <= center and rightindex <= right:

if nums[left] <= nums[rightindex]:

tmparray[tmpindex] = nums[left]

tmpindex += 1

left += 1

else:

tmparray[tmpindex] = nums[rightindex]

tmpindex += 1

rightindex += 1

while left <= center:

tmparray[tmpindex] = nums[left]

tmpindex += 1

left += 1

while rightindex <= right:

tmparray[tmpindex] = nums[rightindex]

tmpindex += 1

rightindex += 1

while begin <= right:

nums[begin] = tmparray[begin]

begin += 1

nums = [6, 5, 3, 1, 7, 2, 4]

nums = merge_sort(nums)

print(nums)

本文標題: 老生常談比較排序之歸併排序(遞迴)

本文位址:

老生常談 分治法與歸併排序

首先來決乙個基本的問題 如何合併兩個有序序列?同樣,我們也採取圖形演示的方法,來一步一步解決問題,假設我們現在存在兩個有序序列 1,3,5和2,4,6,7.那麼我們首先應該在腦海中畫出這樣的一副圖形 到現在,我們已經有解決問題的思路了 比較這兩個序列的第乙個元素,誰較小就輸出誰,然後將較小的元素從原...

歸併排序(遞迴 非遞迴 自然歸併排序)

演算法思想 歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。遞迴實現 include void merge int a,int left,int m,int right void mergesortaux int a,int left,int right void me...

歸併排序 遞迴

歸併排序 採用分治法 divide and conquer 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 遞迴 合併即為歸併 歸併的應用 求逆序對 只需在合併函式中稍加改動 void mergearray i...