package testSort;
/**
* 归并排序算法思想:将两个已排序的子序列合并,形成一个已排序数据序列。
* n个元素的数据序列可以看成是由n个长度为1的已排序子序列组成,反复将相邻的两个子序列归并成一个已排序的子序列
* 直到合并成一个序列,排序完成。
* n个元素的归并排序,每趟比较n-1次,时间复杂度为O(nlog2^n)。
* 归并排序算法是稳定的。每次排序结果都能成为下一趟排序的依据。
* @author 2萌
*
*/
public class MergeSort {
private static void merge(int[] array, int i, int n, int j) {
int[] tempArray = new int[array.length];
int m = n - 1;
int k = i;
int dataLen = j-i+1;
while(i<=m && n<=j) {
if(array[i] < array[n]) {
tempArray[k++] = array[i++];
} else if (array[i] == array[n]) {
tempArray[k++] = array[i++];
n++;
} else if (array[i] > array[n]) {
tempArray[k++] = array[n++];
}
}
while(i<=m) {
tempArray[k++] = array[i++];
}
while(n<=j) {
tempArray[k++] = array[n++];
}
for (int k2 = 0; k2 < dataLen; k2++,j--) {
array[j] = tempArray[j];
}
}
private static void mergeSort(int[] array, int i, int j) {
if(i>=j) {
return;
}
int mid = (i+j)/2;
//使用递归调用把数组分成两个子数组
mergeSort(array, i, mid);
mergeSort(array, mid+1, j);
merge(array, i, mid+1,j);
}
/**
* @param args
*/
public static void main(String[] args) {
int[] array = {49,26,97,19,66,8,52};
mergeSort(array,0,array.length-1);
//打印排序后的数组
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
}
java实现归并排序
最新推荐文章于 2021-04-09 13:58:25 发布