基于JAVA的排序算法之六--归并排序

本文详细介绍了Java实现归并排序的过程,包括递归程序的理解、划分与合并数组的操作,以及具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

六、归并排序

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.}      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值