归并排序--Java
生活随笔
收集整理的這篇文章主要介紹了
归并排序--Java
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歸并排序:
排序原理:
1、盡可能的一組數據拆分成兩個元素相等的子組,并對每一個子組繼續拆分,知道拆分后的每個子組的元素個數是1為止。
2、將相鄰的兩個子組進行合并成一個有序的大組
3、不斷重復步驟2,直到最終只有一個組為止
代碼實現:
package demo02.sort;//排序代碼 public class Merge {private static Comparable[] assist;//歸并所需要的輔助數組/*對數組a中的元素進行排序*/public static void sort(Comparable[] a) {assist = new Comparable[a.length];int lo = 0;int hi = a.length-1;sort(a, lo, hi);}/*對數組a中從lo到hi的元素進行排序*/private static void sort(Comparable[] a, int lo, int hi) {if (hi <= lo) {return;}int mid = lo + (hi - lo) / 2;//對lo到mid之間的元素進行排序;sort(a, lo, mid);//對mid+1到hi之間的元素進行排序;sort(a, mid+1, hi);//對lo到mid這組數據和mid到hi這組數據進行歸并merge(a, lo, mid, hi);}/*對數組中,從lo到mid為一組,從mid+1到hi為一組,對這兩組數據進行歸并*/private static void merge(Comparable[] a, int lo, int mid, int hi) {//lo到mid這組數據和mid+1到hi這組數據歸并到輔助數組assist對應的索引處int i = lo;//定義一個指針,指向assist數組中開始填充數據的索引int p1 = lo;//定義一個指針,指向第一組數據的第一個元素int p2 = mid + 1;//定義一個指針,指向第二組數據的第一個元素//比較左邊小組和右邊小組中的元素大小,哪個小,就把哪個數據填充到assist數組中while (p1 <= mid && p2 <= hi) {if (less(a[p1], a[p2])) {assist[i++] = a[p1++];} else {assist[i++] = a[p2++];}}//上面的循環結束后,如果退出循環的條件是p1<=mid,則證明左邊小組中的數據已經歸并完畢,如果退出循環的條件是p2<=hi,則證明右邊小組的數據已經填充完畢;//所以需要把未填充完畢的數據繼續填充到assist中,//下面兩個循環,只會執行其中的一個while(p1<=mid){assist[i++]=a[p1++];}while(p2<=hi){assist[i++]=a[p2++];}//到現在為止,assist數組中,從lo到hi的元素是有序的,再把數據拷貝到a數組中對應的索引處for (int index=lo;index<=hi;index++){a[index]=assist[index];}}/*比較v元素是否小于w元素*/private static boolean less(Comparable v, Comparable w) {return v.compareTo(w) < 0;}/*數組元素i和j交換位置*/private static void exch(Comparable[] a, int i, int j) {Comparable t = a[i];a[i] = a[j];a[j] = t;} } package demo02.test; import demo02.sort.Merge; import java.util.Arrays; public class TestMerge {public static void main(String[] args) throws Exception {Integer[] arr = {8, 4, 5, 7, 1, 3, 6, 2};Merge.sort(arr);System.out.println(Arrays.toString(arr));} }運行結果:
歸并排序時間復雜度分析:
歸并排序是分治思想的最典型的例子,上面的算法中,對a[lo…hi]進行排序,先將它分為a[lo…mid]和a[mid+1…hi]
兩部分,分別通過遞歸調用將他們單獨排序,最后將有序的子數組歸并為最終的排序結果。該遞歸的出口在于如果
一個數組不能再被分為兩個子數組,那么就會執行merge進行歸并,在歸并的時候判斷元素的大小進行排序。
歸并排序的時間復雜度為:log2(n)* 2^(log2(n))=log2(n)*n,根據大O推導法則,忽略底
數,最終歸并排序的時間復雜度為O(nlogn);
歸并排序的缺點:
需要申請額外的數組空間,導致空間復雜度提升,是典型的以空間換時間的操作。
總結
以上是生活随笔為你收集整理的归并排序--Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm项目目录结构_「Actix
- 下一篇: java美元兑换,(Java实现) 美元