当前位置:   article > 正文

JAVA实现归并排序_归并排序java实现

归并排序java实现

 一.摘要:

        归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

原理:

  • 分解(Divide):将n个元素分成个含n/2个元素的子序列。
  • 解决(Conquer):用合并排序法对两个子序列递归的排序。
  • 合并(Combine):合并两个已排序的子序列已得到排序结果。

二.步骤:

1.归并函数-函数入口:

  1. public static void merge(long[] arry) //arry为需要排序的数组
  2. {
  3. int n=arry.length;//得到数组的长度
  4. long[] temArr = new long[n];//生成一个临时数组
  5. mergeDiv(arry,temArr,0,n-1);//1.分解
  6. }

 

2.归并函数-数组分组:(分解)

  1. private static void mergeDiv(long[] arr,long[] temArr,int right,int left)
  2. {
  3. if(right<left)//当前组中数字个数大于1时
  4. {
  5. int mid = (right+left)/2;//数组中间的位置
  6. mergeDiv(arr,temArr,right,mid);//分解:将数组左半边的数字分为一组
  7. mergeDiv(arr,temArr,mid+1,left);//分解:将数组右半边的数字分为一组
  8. mergeSort(arr,temArr,right,mid,left);//解决:对分解的数组进行排序、合并
  9. }
  10. }

 

3.归并函数-数组排序、合并:

  1. private static void mergeSort(long[] arry,long[] temArr,int left ,int mid,int right)
  2. {
  3. //对分解的数组进行排序、合并
  4. int leftPos=left;//左边一组,第一个数字的位置下标
  5. int rightPos=mid+1;//右边一组,第一个数字的位置下标
  6. int pos=left;//临时存储数组开始存放时的初始下标
  7. while(leftPos<=mid&rightPos<=right)
  8. {
  9. if(arry[rightPos]<arry[leftPos])
  10. {
  11. temArr[pos++]=arry[rightPos++];
  12. }else {
  13. temArr[pos++]=arry[leftPos++];
  14. }
  15. }
  16. while(leftPos<=mid)//将左边一组组内多余数字存入临时数组
  17. {
  18. temArr[pos++]=arry[leftPos++];
  19. }
  20. while(rightPos<=right)//将右边一组组内多余数字存入临时数组
  21. {
  22. temArr[pos++]=arry[rightPos++];
  23. }
  24. while(left<=right)//将临时数组内排序号的数字存入数组
  25. {
  26. arry[left]=temArr[left];
  27. left++;
  28. }
  29. }

三.原代码及测试结果:

1.源代码:

  1. final class newSort {
  2. private newSort(){}
  3. public static void showArry(long[] arry){
  4. for(long m : arry) {System.out.printf("%d ", m);}System.out.println();}
  5. //排序1调用入口:
  6. public static void merge(long[] arry){
  7. int n=arry.length;
  8. long[] temArr = new long[n];
  9. mergeDiv(arry,temArr,0,n-1);}
  10. private static void mergeDiv(long[] arr,long[] temArr,int right,int left) {
  11. if(right<left)
  12. {
  13. int mid = (right+left)/2;
  14. mergeDiv(arr,temArr,right,mid);
  15. mergeDiv(arr,temArr,mid+1,left);
  16. mergeSort(arr,temArr,right,mid,left);
  17. }
  18. }
  19. private static void mergeSort(long[] arry,long[] temArr,int left ,int mid,int right)
  20. {
  21. int leftPos=left;
  22. int rightPos=mid+1;
  23. int pos=left;
  24. while(leftPos<=mid&rightPos<=right)
  25. {
  26. if(arry[rightPos]<arry[leftPos])
  27. {
  28. temArr[pos++]=arry[rightPos++];
  29. }else {
  30. temArr[pos++]=arry[leftPos++];
  31. }
  32. }
  33. while(leftPos<=mid)
  34. {
  35. temArr[pos++]=arry[leftPos++];
  36. }
  37. while(rightPos<=right)
  38. {
  39. temArr[pos++]=arry[rightPos++];
  40. }
  41. while(left<=right)
  42. {
  43. arry[left]=temArr[left];
  44. left++;
  45. }
  46. }
  47. /************************归并排序**************************/
  48. }
  1. public class Test {
  2. public static void main(String[] args)
  3. {
  4. long[] arry= {3,1,9,2,5,7,4,6,8,11,10};
  5. System.out.println("未排序:");
  6. newSort.showArry(arry);
  7. System.out.println("排序后:");
  8. newSort.merge(arry);
  9. newSort.showArry(arry);
  10. }
  11. }

2.测试结果:

未排序:
3 1 9 2 5 7 4 6 8 11 10 
排序后:
1 2 3 4 5 6 7 8 9 10 11 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/67010
推荐阅读
相关标签
  

闽ICP备14008679号