归并排序,(⊙o⊙)…
看上去挺简单的,但这个写起来我觉得是最复杂的。
具体是什么可以百度,建议看我代码之前先看看视频。
好了,下面贴代码:
// 名称:归并排序
// 学校:河北大学
// 作者:来智慧<3552743712@qq.com>
// 时间:2016年10月14日
public class O1014{
public static void main(String[] args){
int[] array = new int[]{61, 20, 65, 4, 22, 97, 6, 36, 79, 8};
// 声明一个整形数组,长度和array相同,存放临时数据
int[] temp = new int[array.length];
printArray(array);
iteration(array, temp, 0, array.length - 1);
printArray(array);
}
// 打印数组
public static void printArray(int[] array){
for(int i = 0; i < array.length; i++){
System.out.print(array[i] + " ");
}
System.out.println();
}
// 一次归并
public static void merge(int[] array, int[] temp, int left, int middle, int right){
// 数组从中间分开,分为左右两个数组,左部分最后位置为中间位置-1
int leftEnd = middle - 1;
// 右边数组元素起始位置为middle
int rightBegin = middle;
// 定义临时数组的首元素下标值为left
int indexOfTemp = left;
// 定义number变量表示数组内元素的个数
int number = right - left + 1;
// 当左指针未遍历到左边数组的末尾且右指针未到达右边数组的末尾时,进入循环
while(left <= leftEnd && rightBegin <= right){
// 比较左边数组第一个元素的数值和右边数组第一个元素的数值大小
// 把两者较小者,放入临时数组temp中
// 同时临时数组的指针右移,左边数组的指针也右移
if(array[left] < array[rightBegin]){
temp[indexOfTemp++] = array[left++];
}
else{
temp[indexOfTemp++] = array[rightBegin++];
}
}
// 当左指针仍未到达末尾,右指针已经遍历到末尾时
// 将左边数组中剩下的元素移动到临时数组中
while(left <= leftEnd){
temp[indexOfTemp++] = array[left++];
}
// 当右指针仍未到达末尾,左指针已经遍历到左边数组末尾时
// 将右边数组中的元素送入临时数组中
while(rightBegin <= right){
temp[indexOfTemp++] = array[rightBegin++];
}
// 由高位到低位依次将临时数组里的值移到array数组中
for(int i = 0; i < number; i++, right--)
{
array[right] = temp[right];
}
}
// 递归调用
public static void iteration(int[] array, int[] temp, int left, int right)
{
if(left < right){
// 将数组的中间位置保存到middle变量中
int middle = (left + right) / 2;
// 将数组划分为两部分,对左右分别进行递归调用
iteration(array, temp, left, middle);
iteration(array, temp, middle + 1, right);
// 递归之后,调用归并函数,将左右数组合并在一起
merge(array, temp, left, middle + 1, right);
}
}
}
可能我脑子太笨,这个程序琢磨了一下午才写出来,希望多与大家切磋交流~