演算法實驗室 12 歸併排序

2021-10-10 06:26:36 字數 2628 閱讀 5652

思想其實很簡單,首先就是乙個二分的思想,分而治之

而要完成乙個二分的遞迴結構還是非常簡單的

static void dcfunc(int arr,int begin,int end)

int mid = (end - begin)/2;

//中間位

int midpos = mid+begin;

//前段是從begin~midpos的這一段

int firstsegmenthead = begin;

//後段是從midpos+1~end的這一段

int secondsegmenthead = midpos+1;

//你獲取兩段資料,就能嘗試歸併了

dcfunc(arr,firstsegmenthead,midpos);

dcfunc(arr,secondsegmenthead,end);

}

二分法是歸併的核心,其實快排也是,我們留到後面講

繼續回到歸併演算法,用比較通俗的講,就是通過二分,將乙個很長的數列劃分成最小單元segment

將segment小到大排序

然後將兩個segment進行merge

比如:現在你所看到的乙個segment<3>,<6>

begin = 0;

end = 1;

mid = (end - begin)/2 = 0;

前段segment[0],

後段segment[1]

前段和後段進行排序,並merge

step1:對每個最小單元進行排序

answer:<3><6>

step2:merge

answer:<3,6>

step2在理解起來很容易,但是使用**進行描述卻犯了難

實現起來,我們需要知道原始資料arr

需要知道結果存放的載體results

需要知道當前二分的兩段beginpos,endpos

這樣我們就能夠對資料進行排序以及合併

public static void rankandmerge3(int arr,int result,int begin,int end)
測試下**:

import jdk.nashorn.internal.runtime.debug;

public class main

int mid = (end - begin)/2;

//中間位

int midpos = mid+begin;

//前段是從begin~midpos的這一段

int firstsegmenthead = begin;

//後段是從midpos+1~end的這一段

int secondsegmenthead = midpos+1;

//你獲取兩段資料,就能嘗試歸併了

dcfunc(arr,firstsegmenthead,midpos);

dcfunc(arr,secondsegmenthead,end);

}static void dcfunc(int arr,int result,int begin,int end)

int mid = (end - begin)/2;

//中間位

int midpos = mid+begin;

//前段是從begin~midpos的這一段

int firstsegmenthead = begin;

//後段是從midpos+1~end的這一段

int secondsegmenthead = midpos+1;

//你獲取兩段資料,就能嘗試歸併了

dcfunc(arr,result,firstsegmenthead,midpos);

dcfunc(arr,result,secondsegmenthead,end);

rankandmerge3(arr,result,begin,end);

}public void rankandmerge(int arr,int result,int begin,int end)

}//彌補丟失的資料

public void rankandmerge2(int arr,int result,int begin,int end)

while (begin<=firstsegmentend)

}public static void rankandmerge3(int arr,int result,int begin,int end)

while (start<=firstsegmentend)

while (secondsegmentbegin<= end)

for(int i = begin;i<=end;i++)

}public static void rank2(int arr,int result,int start,int end)

public static void main(string args) ;

int result = new int[arr.length];

dcfunc(arr,result,0,result.length-1);

for (int i =0;i}

}

演算法1 2 歸併排序

樹狀陣列解逆序對 分治法 將 a l r a l,r a l,r 分解成 a l mid a mid 1,r a l,mid a mid 1,r a l,mi d a mid 1,r 兩部分 呼叫 mer geso rt l mid mergesort l,mid merges ort l,mi d...

演算法實驗室 15 插入排序

什麼是插入排序?這個問題得問鍊錶,鍊錶本身是擁有乙個方法,叫insert listnode node 的函式 實現這個函式其實還是很簡單的 插入函式 public void insert listnode parent,listnode value 那麼,擁有這個插入函樹了我是不是就能做一些事情,比...

歸併演算法 歸併排序

歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...