package com.zz.sort;
import java.util.Random;
public class MergeSortZZ {
public static void main(String[] args) {
//int[] iArrgs = new int[] { 10, 3, 18, 3, 5, 8, 16, 4, 2 };
int iLength = 5000;
int[] iArgs = new int[iLength];
for (int i = 0; i < iLength; i++) {
Random objRandom = new Random();
iArgs[i] = objRandom.nextInt(10000);
}
mergeSort(iArgs, new int[iArgs.length], 0, iArgs.length - 1);
for(int i = 0; i < iArgs.length; i++ ) {
System.out.print(iArgs[i] + " " );
}
}
/**
* 把一个大数组分成两个数组
*
* @param iArrgs 排序数组
* @param tempArrgs 临时数组
* @param left 排序数组左下标
* @param right 排序数组右下标
*/
private static void mergeSort(int[] iArrgs, int[] tempArrgs, int left, int right) {
if(left < right) {
int iMiddle = ( left + right ) / 2;
//左边切分数组
mergeSort(iArrgs, tempArrgs, left, iMiddle) ;
//右边切分数组
mergeSort(iArrgs, tempArrgs, iMiddle + 1, right) ;
//排序
merge(iArrgs, tempArrgs,left,iMiddle + 1,right);
}
}
/**
* 把两个数组按照从小到大的顺序排序
*
* @param iArrgs 排序数组
* @param tempArrgs 临时数组
* @param left 排序数组左下标
* @param middle 排序数组中间位置
* @param right 排序数组右下标
*/
private static void merge(int[] iArrgs, int[] tempArrgs, int left,int middle, int right) {
//左数组末尾下标
int leftEnd = middle -1;
//右数组开始下标
int rightStart = middle;
//临时数组下标
int tempIndex = left;
//数组的长度
int length = right - left + 1;
//两个数组比较大小
while(left <= leftEnd && rightStart <= right) {
//值小的放入临时数组
if (iArrgs[left] < iArrgs[rightStart]) {
tempArrgs[tempIndex++] = iArrgs[left++];
} else {
tempArrgs[tempIndex++] = iArrgs[rightStart++];
}
}
//如果进入下面循环,表示他们在临时数组的中是最大的。
while(left <= leftEnd ) {
tempArrgs[tempIndex++] = iArrgs[left++];
}
//如果进入下面循环,表示他们在临时数组的中是最大的。
while(rightStart <= right) {
tempArrgs[tempIndex++] = iArrgs[rightStart++];
}
for (int i = right; i >= 0; i--) {
//临时数组里面的
iArrgs[i] = tempArrgs[i];
}
}
}
java归并排序
最新推荐文章于 2023-12-29 12:04:23 发布