当前位置:   article > 正文

归并排序算法(经典、常见)

归并排序算法(经典、常见)

今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,---排序

基本概念:

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

分治法:

   基本思想:
将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
   精髓:
       分——将问题分解为规模更小的子问题。
       治——将这些规模更小的子问题逐个击破。
       合——将已解决的子问题合并,最终得到原问题的解。

动图演示: 

代码实现:

  1. import java.util.Arrays;
  2. //归并排序:先分再合
  3. public class MergeSort {
  4. public static void main(String[] args) {
  5. int[] arr = {3,1,4,6,22,0,33,2,745,5,56,8};
  6. int[] temp = new int[arr.length];
  7. System.out.println("未排序数组:"+ Arrays.toString(arr));
  8. mergeSort(arr,0,arr.length-1,temp);
  9. System.out.println("已排序数组:"+ Arrays.toString(arr));
  10. }
  11. //mergeSort()方法:将数组分组出来
  12. public static void mergeSort(int[] arr,int left,
  13. int right,int[] temp){
  14. //将数组进行分组
  15. if (left < right){
  16. int l = left;
  17. int r = right;
  18. int middle = (l+r)/2;
  19. //将分组进行排序整合
  20. merge(arr,left,middle,right,temp);//将左边的部分继续分
  21. mergeSort(arr,0,middle,temp);//将右边的部分继续分
  22. mergeSort(arr,middle+1,r,temp);
  23. }
  24. }
  25. public static void merge(int[] arr,int left,int middle,int right,int[] temp){
  26. int l = left;
  27. int r = middle+1;
  28. int t = 0;
  29. //用于临时数组下标索引
  30. while(l <= middle && r <= right){
  31. //先将两个部分整合
  32. temp[t++] = arr[l] <= arr[r]?arr[l++] : arr[r++];
  33. }
  34. //如果左边的部分还有元素没有被合并,则接着l继续合并
  35. while(l <= middle){
  36. temp[t++] = arr[l++];
  37. }
  38. //如果右边的部分还有元素没有被合并,则接着r继续合并
  39. while (r <= right){
  40. temp[t++] = arr[r++];
  41. }
  42. //将temp临时数组中的元素顺序传到arr数组中
  43. t = 0;
  44. int tempLeft = left;
  45. while(tempLeft <= right){
  46. arr[tempLeft] = temp[t];
  47. tempLeft++;
  48. t++;
  49. }
  50. }
  51. }

代码分析:

基本思路:

步骤:1.将序列中待排序数字分为若干组,每个数字分为一组

           2.将若干个组两两合并,保证合并后的组是有序的

           3.重复第二步操作直到只剩下一组,排序完成

基本思路:

       归并排序,先将数组进行拆分,每次拆成两份,然后继续拆分直到一组有两个元素为止,然后再进行两两整合排序,重复两两整合排序直至数组元素排序完成。

平均时间复杂度:O(nlogn)

注意:

  1. temp[t++] = arr[l] <= arr[r]?arr[l++] : arr[r++];
  2. if (arr[l] <= arr[r]){
  3. temp[t] = arr[l];
  4. t++;l++;
  5. }else{
  6. temp[t] = arr[r];
  7. t++;r++;
  8. }
  9. temp[t++] = arr[l++];
  10. temp[t] = arr[l];
  11. t++;l++;
  12. temp[t++] = arr[r++];
  13. temp[t] = arr[r];
  14. t++;r++;

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

闽ICP备14008679号