分治法在排序算法中的应用(JAVA)--归并排序
分治法最常用的就是將規(guī)模為n的實(shí)例劃分成兩個(gè)n規(guī)模為n/2的實(shí)例 。推廣到一般的情況,我們可以將規(guī)模為n的實(shí)例劃分為b個(gè)規(guī)模為n/b的實(shí)例。這樣對(duì)于算法的運(yùn)行時(shí)間存在遞推式:T(n) = aT(n/b)+f(n),這個(gè)式子又被稱為通用分治遞推式。
我們假定遞推式中的f(n)∈O(n^d),其中d>=0,那么:
所以,對(duì)于等分的T(n) = 2T(n/2) + 1,因?yàn)閍=2,b=2,d=0,并且a > b^d
則T(n) = O(n);
上面這個(gè)式子就是用來(lái)求解遞推式結(jié)果的。
?
歸并排序:(時(shí)間復(fù)雜度O(nlogn))
對(duì)于一個(gè)需要排序的數(shù)組a[0 - n-1],先將數(shù)組一分為二a[0 - n/2-1]和a[n/2+1 - n],對(duì)子數(shù)組排序,之后合并為一個(gè)有序數(shù)組
?
import java.util.Arrays;public class Main {// 合并兩個(gè)有序數(shù)組public static void merge(int[] a, int low, int mid, int high) {int[] temp = new int[high - low + 1];int i = low;// 左指針int j = mid + 1;// 右指針int k = 0;// 把較小的數(shù)先移到新數(shù)組中while (i <= mid && j <= high) {if (a[i] < a[j]) {temp[k++] = a[i++];} else {temp[k++] = a[j++];}}while (i <= mid) {temp[k++] = a[i++];}while (j <= high) {temp[k++] = a[j++];}// 把新數(shù)組中的數(shù)覆蓋a數(shù)組for (int k2 = 0; k2 < temp.length; k2++) {a[k2 + low] = temp[k2];}}// 遞歸分解數(shù)組,當(dāng)待排序的序列長(zhǎng)度為1時(shí),判定為有序public static void mergeSort(int[] a, int low, int high) {int mid = (low + high) / 2;if (low < high) {// 左邊mergeSort(a, low, mid);// 右邊mergeSort(a, mid + 1, high);// 左右歸并merge(a, low, mid, high);System.out.println(Arrays.toString(a));}}public static void main(String[] args) {int[] a = {8, 3, 2, 9, 7, 1, 5, 4};mergeSort(a, 0, a.length - 1);System.out.println("排序結(jié)果:" + Arrays.toString(a));} }
歸并排序在最壞情況下的鍵值比較次數(shù)十分接近基于比較的排序算法在理論上能夠達(dá)到的最少次數(shù)。
此外快速排序和堆排序的時(shí)間復(fù)雜度也是O(nlogn),但是相比來(lái)說(shuō),歸并排序在于其穩(wěn)定性
總結(jié)
以上是生活随笔為你收集整理的分治法在排序算法中的应用(JAVA)--归并排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JAVA读取本地图片并展示
- 下一篇: 蛮力法在求解最优解问题中的应用(JAVA