歸併排序是將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 下面採用遞迴排...