归并排序的流程其实很简单:先分解再合并,整个排序的时间复杂度是稳定的:nlongn,再百万级数据量的排序大致维持在0.5 ~ 1s内
下面是拆分的流程图:
下面是合并的流程图:
动态效果图:
代码实现:
/**
* <p>Title:归并排序</p>
* <p>Description:</p>
*
* @author QIQI
* @date
*/
public class GuibinSort {
public static void main(String[] args) {
int[] arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = new Random().nextInt( 100 );
}
int[] temp = new int[arr.length];
breakUp( arr, 0, arr.length - 1, temp );
for (int i = 0; i < arr.length; i++) {
System.out.println( arr[i] );
}
}
private static void breakUp(int[] arr, int left, int right, int[] temp) {
if (arr != null && arr.length > 0) {
if (left < right) {
int mid = (left + right) / 2;
breakUp( arr, 0, mid, temp );
breakUp( arr, mid + 1, right, temp );
merge( arr, left, mid, right, temp );
} else
return;
}
}
private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = 0;
int j = left, k = right;
while (j <= mid && k <= right) {
if (arr[j] < arr[k]) {
temp[i++] = arr[j++];
} else
temp[i++] = arr[k++];
}
while (j <= mid) {
temp[i++] = arr[j++];
}
while (k <= right) {
temp[i++] = arr[k++];
}
for (int t = 0; t < i; t++) {
arr[left + t] = temp[t];
}
}
}