public class MergeSort {
public static void main(String[] args) {
int[] dealArray = new int[]{11, 22, 5, 3, 6, 1, 10, 7, 8};
mergeSort(dealArray, 9);//注意此处传递的是对象
for(int i = 0; i < 9; i++)
System.out.println(dealArray[i]);
}
public static void mergeSort(int[] dealArray, int length) {
int forNum = (int) Math.ceil(Math.log(length));
for(int i = 0; i <= forNum; i++) {
int numGrp = (int) Math.pow(2, i);//分组之后每组的元素的个数
int groupNum = length / numGrp;//分的组数
int lastNum = length - groupNum * numGrp;
int len = 2 * numGrp;
int j = 0;
for (; j < length - len ; j += len)
merge(dealArray, j, j + numGrp -1, j + len -1);
if (groupNum % 2 == 1 && lastNum != 0)
merge(dealArray, j, j + numGrp -1, length - 1);
}
}
public static void merge(int[] dealArray, int lower, int split, int upper) {
int mark1 = lower;//初始化mark1指向第一个字数组的首元素
int mark2 = split + 1;//初始化mark2指向第二个字数组的首元素
int mark = 0;//初始化mark指向临时数组的首元素
int length = upper - lower + 1;
int[] tempArray = new int[length];
while (mark1 <= split && mark2 <= upper) {
if (dealArray[mark1] <= dealArray[mark2])
tempArray[mark++] = dealArray[mark1++];
else
tempArray[mark++] = dealArray[mark2++];
}
while (mark1 <= split)
tempArray[mark++] = dealArray[mark1++];
while (mark2 <= upper)
tempArray[mark++] = dealArray[mark2++];
for(int i = 0; i < length; i++)
dealArray[lower + i] = tempArray[i];
}
}
算法学习笔记 —— MergeSort 的一种循环实现
最新推荐文章于 2022-03-08 01:18:48 发布