歸併排序的優化 自然歸併排序

2021-09-13 20:00:53 字數 1001 閱讀 7752

不知道怎麼將這個演算法思想表達的更好,也不知道自己的理解的是否對

黑體的注釋是普通的自然歸併,從相鄰長度為1的子陣列段進行合併也就是一開始將每兩個相鄰元素進行歸併,然後再相鄰四個元素左右兩組都有序的合併成4個有序的........自下向上不斷往上歸併直到有序

/** 自然合併排序是合併排序演算法的一種改進. 自然合併排序:

* 對於初始給定的陣列,通常存在多個長度大於1的已自然排好序的子陣列段.

* 例如,若陣列a中元素為,則自然排好序的子陣列段有,,,.

* 構成更大的排好序的子陣列段(,).繼續合併相鄰排好序的子陣列段,直至整個陣列已排好序.**

* 用乙個陣列t[n]來儲存陣列排好序的子陣列段   下標表示第i段  值表示在原陣列值下降的位置(在公升序的情況下)

* 例如 arr  t[0] = 0  t[1] = 2 t[2]=4 t[3]=7 那麼一共有4段子陣列

** 用t[n]代替之前的陣列長度,從步長為1開始合併 表示相鄰為步長的t[n]子陣列段   t[n]來表示要合併的子陣列下標

*/public class 自然合併排序 ;

t = new int[arr.length];

t[0] = 0;//第乙個賦值為0 第乙個數字肯定是有序的

getpart(arr);

mergesore(arr,arr.length);

for(int i=0;iprivate static void getpart(int arr)

//相當於 一根繩子 切了三刀  分成了四條  的意思   第乙個t[0]不算 只是表示起點

part = k; // 因為前面是k++ 所以k表示陣列分成了幾段有序子陣列段

}private static void mergesore(int arr,int n)

if(left>j)

}else

}//賦值回原陣列

for(int l=0;l

歸併排序以及歸併排序的優化

1 歸併排序的實現 歸併排序也利用了分治法的思想,首先將序列分成左右兩部分,將左右兩部分分別排序,然後將有序的兩個子串行進行合併 即merge操作 程式是遞迴進行的,主函式實現如下 歸併排序主函式 void merge sort int a,int first,int last else while...

歸併排序(遞迴 非遞迴 自然歸併排序)

演算法思想 歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。遞迴實現 include void merge int a,int left,int m,int right void mergesortaux int a,int left,int right void me...

歸併排序的優化

上節中的陣列合併 中,沒有做任何判斷就進行了陣列的合併,實際上當陣列1的最後乙個元素小於陣列2的第乙個元素時,根本不需要挨個對比 複製元素進行合併操作,此時陣列1和陣列2本來就是有序的,不需要合併,因此 改為 部分 mergesort1 list1,listsize1 mergesort1 list...