个人随笔
目录
Java实现九种排序算法8:归并排序
2020-04-12 23:09:30

基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

原理
归并排序是一种递归算法,不断将列表拆分为一半,如果列表为空或有一个项,则按定义进行排序。如果列表有多个项,我们分割列表,并递归调用两个半部分的合并排序。一旦对两半排序完成,获取两个较小的排序列表并将它们组合成单个排序的新列表的过程

归并细节:

比如有两个已经排序好的数组,如何将他归并成一个数组?

我们可以开辟一个临时数组来辅助我们的归并。也就是说他比我们插入排序也好,选择排序也好多使用了存储的空间,也就是说他需要o(n)的额外空间来完成这个排序。只不过现在计算机中时间的效率要比空间的效率重要的多。无论是内存也好还是硬盘也好可以存储的数据越来越多,所以设计一个算法,时间复杂度是要优先考虑的。

整体来讲我们要使用三个索引来在数组内进行追踪。

蓝色的箭头表示最终选择的位置,而红色的箭头表示两个数组当前要比较的元素,比如当前是2与1比较,1比2小,所以1放到蓝色的箭头中,蓝色的箭头后移,1的箭头后移。

然后2与4比较,2比4小那么2到蓝色的箭头中,蓝色箭头后移,2后移,继续比较…….

归并思路就是这样了,最后唯一需要注意的是那个先比较完的话,那么剩下的直接不需要比较,把后面的直接移上去就可以了,这个需要提前判定一下。

java实现

  1. public class GuiBin {
  2. public static void main(String[] args) {
  3. int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};
  4. System.out.println("排序之前:");
  5. for (int i = 0; i < a.length; i++) {
  6. System.out.print(a[i]+" ");
  7. }
  8. //归并排序
  9. mergeSort(a,0,a.length-1);
  10. System.out.println();
  11. System.out.println("排序之后:");
  12. for (int i = 0; i < a.length; i++) {
  13. System.out.print(a[i]+" ");
  14. }
  15. }
  16. private static void mergeSort(int[] a, int left, int right) {
  17. if(left<right){
  18. int middle = (left+right)/2;
  19. //对左边进行递归
  20. mergeSort(a, left, middle);
  21. //对右边进行递归
  22. mergeSort(a, middle+1, right);
  23. //合并
  24. merge(a,left,middle,right);
  25. }
  26. }
  27. private static void merge(int[] a, int left, int middle, int right) {
  28. int[] tmpArr = new int[a.length];
  29. int mid = middle+1; //右边的起始位置
  30. int tmp = left;
  31. int third = left;
  32. while(left<=middle && mid<=right){
  33. //从两个数组中选取较小的数放入中间数组
  34. if(a[left]<=a[mid]){
  35. tmpArr[third++] = a[left++];
  36. }else{
  37. tmpArr[third++] = a[mid++];
  38. }
  39. }
  40. //将剩余的部分放入中间数组
  41. while(left<=middle){
  42. tmpArr[third++] = a[left++];
  43. }
  44. while(mid<=right){
  45. tmpArr[third++] = a[mid++];
  46. }
  47. //将中间数组复制回原数组
  48. while(tmp<=right){
  49. a[tmp] = tmpArr[tmp++];
  50. }
  51. }
  52. }
 332

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2