六、归并排序
java代码实现:
**
02.归并排序:里面是一个递归程序,深刻理解之。
03.*/
04.public class
MergeSort{
05.
06.
13. public
void partition(Integer[] arr, int from, int end)
{
14.
//划分到数组只有一个元素时才不进行再划分
15.
if (from < end)
{
16.
//从中间划分成两个数组
17.
int mid = (from + end) /
2;
18.
partition(arr, from,
mid);
19.
partition(arr, mid + 1,
end);
20.
//合并划分后的两个数组
21.
merge(arr, from, end,
mid);
22.
}
23.
}
24.
25.
34. public
void merge(Integer[] arr, int from, int end, int mid)
{
35.
Integer[] tmpArr = new
Integer[10];
36.
int tmpArrIndex =
0;//指向临时数组
37.
int part1ArrIndex =
from;//指向第一部分数组
38.
int part2ArrIndex = mid +
1;//指向第二部分数组
39.
40.
//由于两部分数组里是有序的,所以每部分可以从第一个元素依次取到最后一个元素,再对两部分
41.
//取出的元素进行比较。只要某部分数组元素取完后,退出循环
42.
while ((part1ArrIndex <= mid)
&& (part2ArrIndex <=
end))
{
43.
//从两部分数组里各取一个进行比较,取最小一个并放入临时数组中
44.
if (arr[part1ArrIndex] - arr[part2ArrIndex] < 0)
{
45.
//如果第一部分数组元素小,则将第一部分数组元素放入临时数组中,并且临时数组指针
46.
//tmpArrIndex下移一个以做好下次存储位置准备,前部分数组指针part1ArrIndex
47.
//也要下移一个以便下次取出下一个元素与后部分数组元素比较
48.
tmpArr[tmpArrIndex++] =
arr[part1ArrIndex++];
49.
} else
{
50.
//如果第二部分数组元素小,则将第二部分数组元素放入临时数组中
51.
tmpArr[tmpArrIndex++] =
arr[part2ArrIndex++];
52.
}
53.
}
54.
//由于退出循环后,两部分数组中可能有一个数组元素还未处理完,所以需要额外的处理,当然不可
55.
//能两部分数组都有未处理完的元素,所以下面两个循环最多只有一个会执行,并且都是大于已放入
56.
//临时数组中的元素
57.
while (part1ArrIndex <= mid)
{
58.
tmpArr[tmpArrIndex++] =
arr[part1ArrIndex++];
59.
}
60.
while (part2ArrIndex <= end)
{
61.
tmpArr[tmpArrIndex++] =
arr[part2ArrIndex++];
62.
}
63.
64.
//最后把临时数组拷贝到源数组相同的位置
65.
System.arraycopy(tmpArr, 0, arr, from, end - from +
1);
66.
}
67.
68.
72. public
static void main(String[] args)
{
73.
Integer[] intgArr =
{5,9,1,4,2,6,3,8,0,7};
74.
MergeSort insertSort = new
MergeSort();
75.
insertSort.partition(intgArr,0,intgArr.length-1);
76.
for(Integer
a:intgArr){
77.
System.out.print(a + "
");
78.
}
79.
}
80.}