演算法 歸併排序

2021-08-05 20:04:46 字數 1762 閱讀 8537

歸併排序是將n個記錄看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,最終合成乙個有序序列。

將陣列對半拆分,一直拆分到只有乙個元素。然後做歸併操作。

歸併操作:

建立乙個臨時陣列,然後將兩個元素較小值先放入臨時陣列,再放次小者,將臨時陣列的內容賦給原陣列。迴圈整個陣列

再次建立臨時陣列,將陣列四個四個進行操作,先放最小者,再放次小者。迴圈整個陣列。直到進行整個陣列的操作

2.1 非遞迴方式

public

static

void

main(string args) ;

mergesort(src);

print(src);

}public

static

void

mergesort(int a)

//將歸併步長*2

len *= 2;

}}//歸併操作

public

static

void

merge(int a, int i, int len)

//將前半段剩餘的部分放入temp陣列

while(i < m && i < a.length)

temp[count++] = a[i++];

//將後半段剩餘的部分放入陣列

while(j < n && j < a.length)

temp[count++] = a[j++];

count = 0;

//將temp陣列中的內容放入待排序的陣列,start為傳入的起始位置

while(start < temp.length && start < a.length)

a[start++] = temp[count++];

}public

static

void

print(int src)

system.out.println();

}

2.2 遞迴方式

public

static

void

main(string args) ;

mergesort(src, 0, src.length-1);

print(src);

}public

static

void

mergesort(int data,int left,int right)

}public

static

void

merge(int a, int low, int high) else

}//歸併前半部分剩餘者

while (i <= mid)

//歸併後半部分剩餘者

while (j <= high)

//賦值給原陣列

count = 0;

while (low <= high)

}public

static

void

print(int src)

system.out.println();

}

兩兩歸併,掃瞄整個陣列的複雜度為o(n)。而歸併操作類似樹結構,所以總共需要logn次。所以總的複雜度為o(nlogn)

空間複雜度為o(n)

歸併是穩定的排序方法

歸併演算法 歸併排序

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

歸併排序演算法

include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...

歸併排序演算法

這個演算法感覺比插入難理解一些,下面說說我的理解 歸併排序的步驟 1.把長度為n的序列分為兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個子串行合併成乙個最終的排序序列 通過步驟2可看到 在歸併排序中又用了歸併排序,可見這是乙個遞迴的過程。例如乙個陣列 a 8 下面採用遞迴排...