Java排序算法三之歸并排序的遞歸與非遞歸的案例分析?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
歸并有遞歸和非遞歸兩種。
歸并的思想是:
1.將原數(shù)組首先進(jìn)行兩個(gè)元素為一組的排序,然后合并為四個(gè)一組,八個(gè)一組,直至合并整個(gè)數(shù)組;
2.合并兩個(gè)子數(shù)組的時(shí)候,需要借助一個(gè)臨時(shí)數(shù)組,用來存放當(dāng)前的歸并后的兩個(gè)數(shù)組;
3.將臨時(shí)數(shù)組復(fù)制回原數(shù)組對(duì)應(yīng)的位置。
非遞歸的代碼如下:
package mergesort; import java.util.Arrays; import java.util.Random; import java.util.Scanner; //歸并排序的非遞歸算法 public class MergeSort{ public static void main(String args[]){ MergeSort mer = new MergeSort(); int[] array = mer.getArray(); System.out.println("OriginalArray:" + Arrays.toString(array)); mer.mergeSort(array); System.out.println("SortedArray:" + Arrays.toString(array)); } public int[] getArray(){ Scanner cin = new Scanner(System.in); System.out.print("Input the length of Array:"); int length = cin.nextInt(); int[] arr = new int[length]; Random r = new Random(); for(int i = 0; i < length; i++){ arr[i] = r.nextInt(100); } cin.close(); return arr; } public void mergeSort(int[] a){ int len = 1; while(len < a.length){ for(int i = 0; i < a.length; i += 2*len){ merge(a, i, len); } len *= 2; } } public void merge(int[] a, int i, int len){ int start = i; int len_i = i + len;//歸并的前半部分?jǐn)?shù)組 int j = i + len; int len_j = j +len;//歸并的后半部分?jǐn)?shù)組 int[] temp = new int[2*len]; int count = 0; while(i < len_i && j < len_j && j < a.length){ if(a[i] <= a[j]){ temp[count++] = a[i++]; } else{ temp[count++] = a[j++]; } } while(i < len_i && i < a.length){//注意:這里i也有可能超過數(shù)組長度 temp[count++] = a[i++]; } while(j < len_j && j < a.length){ temp[count++] = a[j++]; } count = 0; while(start < j && start < a.length){ a[start++] = temp[count++]; } } }