排序算法之归并排序及Java实现

忘是亡心i 2022-05-26 04:07 291阅读 0赞

一、排序算法的分类

  1. 选择排序(直接选择排序,堆排序)
  2. 交换排序(冒泡排序,快速排序)
  3. 插入排序(直接插入排序,希尔排序)
  4. 归并排序
  5. 桶式排序
  6. 基数排序

二、归并排序的原理

归并排序利用的是分治的思想实现的,对于给定的一组数据,利用递归与分治技术将数据序列划分成为越来越小的子序列,之后对子序列排序,最后再用递归方法将排好序的子序列合并成为有序序列。合并两个子序列时,需要申请两个子序列加起来长度的内存,临时存储新的生成序列,再将新生成的序列赋值到原数组相应的位置。

三、归并排序的实现

  1. public class MergeSort {
  2. public static void merSort(int[] arr,int left,int right){
  3. if(left<right){
  4. int mid = (left+right)/2;
  5. merSort(arr,left,mid);//左边归并排序,使得左子序列有序
  6. merSort(arr,mid+1,right);//右边归并排序,使得右子序列有序
  7. merge(arr,left,mid,right);//合并两个子序列
  8. }
  9. }
  10. private static void merge(int[] arr, int left, int mid, int right) {
  11. int[] temp = new int[right - left + 1];//ps:也可以从开始就申请一个与原数组大小相同的数组,因为重复new数组会频繁申请内存
  12. int i = left;
  13. int j = mid+1;
  14. int k = 0;
  15. while(i<=mid&&j<=right){
  16. if (arr[i] < arr[j]) {
  17. temp[k++] = arr[i++];
  18. } else {
  19. temp[k++] = arr[j++];
  20. }
  21. }
  22. while(i<=mid){
  23. //将左边剩余元素填充进temp中
  24. temp[k++] = arr[i++];
  25. }
  26. while(j<=right){
  27. //将右序列剩余元素填充进temp中
  28. temp[k++] = arr[j++];
  29. }
  30. //将temp中的元素全部拷贝到原数组中
  31. for (int k2 = 0; k2 < temp.length; k2++) {
  32. arr[k2 + left] = temp[k2];
  33. }
  34. }
  35. public static void main(String args[]){
  36. int[] test = {
  37. 9,2,6,3,5,7,10,11,12};
  38. merSort(test,0,test.length-1);
  39. for(int i=0; i<test.length;i++){
  40. System.out.print(test[i] + " ");
  41. }
  42. }
  43. }

测试结果

  1. 2 3 5 6 7 9 10 11 12

发表评论

表情:
评论列表 (有 0 条评论,291人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法归并排序Java实现

    归并排序的思想是将局部有序的数组合并为一个大的有序数组,前提是需要保证局部数组有序,如果局部没有顺序,那么就拆分,再合并,最差的情况是,拆到两个数组都只有一个元素的时候,这时候

    相关 排序算法归并排序

    归并排序是利用递归与分治思想将数据序列划分成越来越小的半子序列,在对其进行排序,最后利用递归将排好序的半子序列合并成越来越大的有序序列。 归并排序中,归 即是递归的意思,即递