【演算法】歸併排序演算法的java實現
阿新 • • 發佈:2018-12-17
- 歸併排序的核心程式碼:
private static void mergeSort(int[] a, int i, int j) {
if (i < j) {
int mid = (i+j)/2;//這裡取中位數,不能是(j-i+1)/2
mergeSort(a, i, mid);
mergeSort(a, mid+1, j);
merge(a,i,mid,j);
}
}
- 合併兩個有序陣列
//注意這個函式必須有left引數,不可以每次都是從0開始。 private static void merge(int[] a,int left, int mid, int right) { int i = left; int j = mid+1; int k = 0; int ans[] = new int[right-left+1];//儲存排好序的結果 while (i <= mid && j <= right) { if (a[i] <= a[j]) { ans[k++] = a[i++]; }else{ ans[k++] = a[j++]; } } while(i <= mid) { ans[k++] = a[i++]; } while(j <= right) { ans[k++] = a[j++]; } //改變引數中的a數組裡儲存的值(不能只傳引用) for(int t = left,tans=0;t <= right;t++) { a[t] = ans[tans++]; } }
- 隨機生成指定個數的陣列
private static int[] getRandomArr(int numberCount) {
int a[] = new int[numberCount];
for (int i = 0; i < a.length; i++) {
a[i] = (int) (1+(int)(Math.random()*(numberCount*5-1)));//生成從1~numberCount的隨機數
}
return a;
}
- 主函式
public static void main(String[] args) { int n = 20;//生成20個元素的陣列 int a[] = getRandomArr(n);//陣列個數 System.out.println("歸併排序 defore:"); System.out.println(Arrays.toString(a)); mergeSort(a,0,n-1); System.out.println("after:"); System.out.println(Arrays.toString(a));