归并排序算法(java实现)
基本思想
歸并排序是由遞歸實(shí)現(xiàn)的,主要是分而治之的思想,也就是通過(guò)將問(wèn)題分解成多個(gè)容易求解的局部性小問(wèn)題來(lái)解開(kāi)原本的問(wèn)題的技巧。
歸并排序在合并兩個(gè)已排序數(shù)組時(shí),如果遇到了相同的元素,只要保證前半部分?jǐn)?shù)組優(yōu)先于后半部分?jǐn)?shù)組, 相同元素的順序就不會(huì)顛倒。所以歸并排序?qū)儆诜€(wěn)定的排序算法。
每次分別排左半邊和右半邊,不斷遞歸調(diào)用自己,直到只有一個(gè)元素遞歸結(jié)束,開(kāi)始回溯,調(diào)用 merge 函數(shù),合并兩個(gè)有序序列,再合并的時(shí)候每次給末尾追上一個(gè)最大 int 這樣就不怕最后一位的數(shù)字不會(huì)被排序。
歸并排序的效率是比較高的,設(shè)數(shù)列長(zhǎng)為N,將數(shù)列分開(kāi)成小數(shù)列一共要logN步,每步都是一個(gè)合并有序數(shù)列的過(guò)程,時(shí)間復(fù)雜度可以記為O(N),故一共為O(N log N)。因?yàn)闅w并排序每次都是在相鄰的數(shù)據(jù)中進(jìn)行操作,所以歸并排序在O(N*logN)的幾種排序方法(快速排序,歸并排序,希爾排序,堆排序)也是效率比較高的。
排序過(guò)程
?
算法流程:
1、將一個(gè)數(shù)組拆分為兩個(gè),從中間點(diǎn)拆開(kāi),通過(guò)遞歸操作來(lái)實(shí)現(xiàn)一層一層拆分。
2、從左右數(shù)組中選擇小的元素放入到臨時(shí)空間,并移動(dòng)下標(biāo)到下一位置。
3、重復(fù)步驟2直到某一下標(biāo)達(dá)到尾部。
4、將另一序列剩下的所有元素依次放入臨時(shí)空間。
5、將臨時(shí)空間的數(shù)據(jù)依次放入原數(shù)據(jù)數(shù)組。
基礎(chǔ)代碼
package Sort; //針對(duì) 一個(gè)數(shù)組 左右兩部分已經(jīng)排好序 public class 歸并排序基礎(chǔ) {public static void main(String[] args) {int[] arr = {1,4,7,8,3,6,9};merge(arr);} // 把數(shù)組arr = {1,4,7,8,3,6,9} 分成兩部分 分別為1,4,7,8 和 3,6,9static void merge(int[] arr) {int mid = arr.length / 2;int[] temp = new int[arr.length];int i = 0; //i是數(shù)組arr前部分的第一位int j = mid+1; //j是數(shù)組arr后部分的第一位int k = 0; //k是 新數(shù)組temp的第一位//當(dāng) arr數(shù)組兩邊都還有數(shù) 時(shí)while (i <= mid && j < arr.length) {if (arr[i] <= arr[j]) {temp[k] = arr[i];i++;k++;} else {temp[k] = arr[j];j++;k++;}}//將右邊剩余的歸并while (i <= mid) {temp[k++] = arr[i++];}//將左邊剩余的歸并while (j < arr.length) {temp[k++] = arr[j++];}print(temp);}//排序static void swap(int[] arr,int i,int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//打印static void print(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}} }加入歸并的代碼
package Sort;public class 歸并排序遞歸 {public static void main(String[] args) { // int[] arr = {1,4,7,8,3,6,9};int[] arr = {3,0,6,4,1,3,7,8,5,9};sort(arr,0,arr.length-1);print(arr);}public static void sort(int[] arr,int left,int right) {if (left == right) {return;}//分成兩半int mid = left +(right-left)/2;//左邊排序sort(arr, left, mid);//右邊排序sort(arr, mid +1, right);merge(arr, left, mid+1, right);}//leftPtr 指數(shù)組最左邊//rightPtr 指數(shù)組中間//rightBound 數(shù)組最右邊static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound) {int mid = rightPtr - 1; int[] temp = new int[rightBound - leftPtr + 1];int i = leftPtr; int j = rightPtr; int k = 0; while (i <= mid && j <= rightBound) {if (arr[i] <= arr[j]) {temp[k] = arr[i];i++;k++;} else {temp[k] = arr[j];j++;k++;}}// 將右邊剩余的歸并while (i <= mid) {temp[k++] = arr[i++];}//將左邊剩余的歸并while (j <= rightBound) {temp[k++] = arr[j++];}for(int m = 0; m < temp.length;m++) arr[leftPtr+m] = temp[m];}//排序static void swap(int[] arr,int i,int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//打印static void print(int[] arr) {for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}} }總結(jié)
以上是生活随笔為你收集整理的归并排序算法(java实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows2003——IIS
- 下一篇: 小凡模拟器:DynamipsGUI使用问