当前位置:   article > 正文

内部排序方式学习3(归并排序详解)_归并排序内部用的什么排序

归并排序内部用的什么排序

归并排序图解

       归并排序是利用归并思想实现的排序,采用分治策略,将问题分成各个部分,然后将各个部分的到的答案合并到一起,继而治之。

       思路及流程如下图:

       如上图所示,将分后的元素进行排序组合,可以创建一个临时数组,假设采取从小到大的方式排序,比较指针i指向的元素的值和指针j指向的值,若j指针指向的元素的值较小,则将其加入temp中,接着j和t指针向后移动,代码如下:

  1. //治,合并相邻两个子序列,从小到大
  2. public static void merge(int[] arr, int left, int mid, int right, int[] temp){
  3. //i指针指向左边有序序列的初始索引
  4. int i = left;
  5. //j指针指向右边有序序列的初始索引
  6. //因为arr的长度可能是奇数,所以mid + 1
  7. int j = mid + 1;
  8. //指向temp当前索引
  9. int t = 0;
  10. //使temp中的元素有序
  11. while (i <= mid && j <= right){
  12. //如果i指向元素的值小于j指向的元素的值
  13. //temp[t] = arr[i],t和i再分别后移
  14. if (arr[i] <= arr[j]){
  15. temp[t++] = arr[i++];
  16. } else {
  17. temp[t++] = arr[j++];
  18. }
  19. }
  20. //如果满足条件表示还有元素未加入temp中
  21. while (i <= mid){
  22. temp[t++] = arr[i++];
  23. }
  24. while (j <= right){
  25. temp[t++] = arr[j++];
  26. }
  27. //重置t,将temp中的元素拷贝到arr中
  28. t = 0;
  29. int tempLeft = left;
  30. while (tempLeft <= right){
  31. arr[tempLeft++] = temp[t++];
  32. }
  33. }
  34. }

       分的步骤如图:

       因为需要经过多次分治,所以可以使用递归解决。

完整代码

  1. public class MergeSort {
  2. public static void main(String[] args) {
  3. int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
  4. int[] temp = new int[arr.length];
  5. System.out.println("排列前的结果为:" + Arrays.toString(arr));
  6. mergeSort(arr, 0, arr.length - 1, temp);
  7. System.out.println("排列后的结果为:" + Arrays.toString(arr));
  8. }
  9. public static void mergeSort(int[] arr, int left, int right, int[] temp){
  10. //结束条件
  11. if (left < right) {
  12. int mid = (left + right) / 2;
  13. //处理左边
  14. mergeSort(arr, left, mid, temp);
  15. //处理右边
  16. mergeSort(arr, mid + 1, right, temp);
  17. //归并
  18. merge(arr, left, mid, right, temp);
  19. }
  20. }
  21. /**
  22. *
  23. * @param arr 数组
  24. * @param left 初始索引
  25. * @param mid 中间索引
  26. * @param right 最后索引
  27. * @param temp 临时数组
  28. */
  29. //治,合并相邻两个子序列,从小到大
  30. public static void merge(int[] arr, int left, int mid, int right, int[] temp){
  31. //i指针指向左边有序序列的初始索引
  32. int i = left;
  33. //j指针指向右边有序序列的初始索引
  34. //因为arr的长度可能是奇数,所以mid + 1
  35. int j = mid + 1;
  36. //指向temp当前索引
  37. int t = 0;
  38. //使temp中的元素有序
  39. while (i <= mid && j <= right){
  40. //如果i指向元素的值小于j指向的元素的值
  41. //temp[t] = arr[i],t和i再分别后移
  42. if (arr[i] <= arr[j]){
  43. temp[t++] = arr[i++];
  44. } else {
  45. temp[t++] = arr[j++];
  46. }
  47. }
  48. //如果满足条件表示还有元素未加入temp中
  49. while (i <= mid){
  50. temp[t++] = arr[i++];
  51. }
  52. while (j <= right){
  53. temp[t++] = arr[j++];
  54. }
  55. //重置t,将temp中的元素拷贝到arr中
  56. t = 0;
  57. int tempLeft = left;
  58. while (tempLeft <= right){
  59. arr[tempLeft++] = temp[t++];
  60. }
  61. }
  62. }

结果

  1. 排列前的结果为:[8, 4, 5, 7, 1, 3, 6, 2]
  2. 排列后的结果为:[1, 2, 3, 4, 5, 6, 7, 8]

还在学习中,有问题辛苦指出。

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

闽ICP备14008679号