歸并排序(Java)
博客說明
文章所涉及的資料來自互聯網整理和個人總結,意在于個人學習和經驗匯總,如有什么地方侵權,請聯系本人洗掉,謝謝!
歸并排序介紹
歸并排序(MERGE-SORT)是利用歸并的思想實作的排序方法,該演算法采用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞回求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之),
代碼
package cn.guizimo.sort;
import java.util.Arrays;
public class MergetSort {
public static void main(String[] args) {
int arr[] = {8, 4, 5, 7, 1, 3, 6, 2};
int temp[] = new int[arr.length];
System.out.println("排序前");
System.out.println(Arrays.toString(arr));
mergeSort(arr, 0, arr.length - 1, temp);
System.out.println("排序后");
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid, temp);
mergeSort(arr, mid + 1, right, temp);
merge(arr, left, mid, right, temp);
}
}
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[t] = arr[i];
t += 1;
i += 1;
} else {
temp[t] = arr[j];
t += 1;
j += 1;
}
}
while (i <= mid) {
temp[t] = arr[i];
t += 1;
i += 1;
}
while (j <= right) {
temp[t] = arr[j];
t += 1;
j += 1;
}
t = 0;
int tempIndex = left;
while (tempIndex <= right) {
arr[tempIndex] = temp[t];
t += 1;
tempIndex += 1;
}
}
}
測驗

速度測驗
package cn.guizimo.sort;
import java.util.Arrays;
public class MergetSort {
public static void main(String[] args) {
int max = 80000;
int[] arr = new int[max];
for (int i = 0; i < max; i++) {
arr[i] = (int)(Math.random() * 8000000);
}
int temp[] = new int[arr.length];
long date1 = System.currentTimeMillis();
mergeSort(arr, 0, arr.length - 1, temp);
long date2 = System.currentTimeMillis();
System.out.println("歸并排序"+max+"陣列的時間為:"+(date2-date1));
}
public static void mergeSort(int[] arr, int left, int right, int[] temp) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid, temp);
mergeSort(arr, mid + 1, right, temp);
merge(arr, left, mid, right, temp);
}
}
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[t] = arr[i];
t += 1;
i += 1;
} else {
temp[t] = arr[j];
t += 1;
j += 1;
}
}
while (i <= mid) {
temp[t] = arr[i];
t += 1;
i += 1;
}
while (j <= right) {
temp[t] = arr[j];
t += 1;
j += 1;
}
t = 0;
int tempIndex = left;
while (tempIndex <= right) {
arr[tempIndex] = temp[t];
t += 1;
tempIndex += 1;
}
}
}

感謝
尚硅谷
萬能的網路
以及勤勞的自己
關注公眾號: 歸子莫,獲取更多的資料,還有更長的學習計劃
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156475.html
標籤:Java
上一篇:集合繼承關系和實作
