1. **归并排序**(Merge Sort )是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。l

07归并排序.mp4

算法思路

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序;
  • 将两个排序好的子序列合并成一个最终的排序序列。
  • image.png

分阶段,可以理解为就是递归拆分子序列的过程,递归深度为log2n。
治阶段,我们需要将两个已经有序的子序列合并成一个有序序列

如何将两个已经有序的子序列合并成一个有序的序列,我们需要借助一个临时数组temp。那么以(29,38,65,87)和{23,27,72,78}两个子序列为例,进行合并。

设置2个指针i和j,初始i指向第1个子集的开头,j指向第2个子集的开头,然后比较2个元素,将最小的值放入temp数组,放入哪个子集的数据,就向后移动哪个子集的指针。

谁放进了temp里面谁++
QQ浏览器截图20210808102446.jpg
第一趟:比较i位置和j位置的元素,将最小值23填入temp数组中,同时j++。
第二趟:比较i位置和j位置的元素,将最小值27填入temp数组中,同时j++。

代码实现

  1. public class MergeSort{
  2. public static void main(String[] args){
  3. int [ ]arr = {8,4,5,7,1,3,6,2};
  4. mergesort(arr, e,arr.length-1);
  5. System.out.println(Arrays.toString(arr));
  6. }
  7. public statuc void mergeSort(int[] arr,int low ,int high)
  8. {
  9. if(low<high)
  10. {
  11. int mid = (low + high)/2;
  12. //对左边进行归并排序
  13. mergeSort(arr,low,mid);
  14. //对右边进行归并排序
  15. mergeSort(arr,mid+1,heigh);
  16. //合并
  17. merge()
  18. }
  19. }
  20. public static void merge(int[] arr, int low, int mid, int high)
  21. {
  22. //创建1个临时数组
  23. int[] temp = new int[arr.length];
  24. int i = low;
  25. int j = mid+1;
  26. while(i<=mid && j<=high)
  27. {
  28. if(arr[i]<=arr[j])
  29. {
  30. temp[k++] = arr[i++];
  31. }else{
  32. temp[k++] = arr[j++];
  33. }
  34. }
  35. //如果左边有剩余
  36. while(i<=mid)
  37. {
  38. temp[k++] = arr[i++];
  39. }
  40. //若果右边有剩余
  41. while(i<=mid)
  42. {
  43. temp[k++] = arr[j++];
  44. }
  45. k=0;
  46. while(low<=high)
  47. {
  48. arr[low++] = temp[k++];
  49. }
  50. }
  51. }

算法稳定性:

如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,通俗地讲,就是两个相同的数的相对顺序不会发生改变,则该算法是稳定的:归并排序是稳定的排序算法。

时间复杂度:

O(nlog2n)