05-排序【归并排序】算法学习
- 思想:运用递归思想,将原始数据分为两部分进行排序,然后合并已排序的子数组
- 操作:比较
- 是否稳定排序:否
- 是否原地排序:否
- 时间复杂度:O(nlogn)
- 最好时间复杂度:O(nlogn)
- 最坏时间复杂度:O(nlogn)
- 平均时间复杂度:O(nlogn)
- 空间复杂度:O(n)
总结:归并排序运用递归算法、以及分治的思想,将大问题转换为其子问题,然后合并子解,最终求的结果的算法。
实现代码(java)含义解释如下:
-
int[] sort(int[] arr, int p, int q)方法:用于将数组arr内待排序的下标p至q的集合,分解为两个子数组,arr[p, r] 和 arr[r, q]。
终止条件是,当数组内元素被分解至一个时,则该数组不可再分解,即返回该元素(该元素为已排序的最小子集)。 -
int[] merge(int[] arr1, int[] arr2)方法:将两个有序数组合为一个有序数组集合。
算法思想是:比较arr1的首元素(指针为i)和arr2的首元素(指针为j),将小的元素放入新数组中,此时将i或j向后移动一位,直至arr1或者arr2的指针指向null时,最后将arr1或者arr2的剩余元素依次插入到新数组后面,即完成排序。
public static void main(String[] args) { int[] arr = new int[]{6, 5, 11, 3, 1, 7, 9, 4, 2, 8}; int[] result = sort(arr, 0, arr.length); System.out.println(result); } public static int[] sort(int[] arr, int p, int q) { int r = (p+q)/2; if (p >= r) { return new int[]{arr[p]}; } return merge(sort(arr, p, r), sort(arr, r, q)); } public static int[] merge(int[] arr1, int[] arr2) { int[] newArr = new int[arr1.length + arr2.length]; int k = 0; int i, j; for (i = 0, j = 0; i < arr1.length && j < arr2.length;) { if (arr1[i] < arr2[j]) { newArr[k] = arr1[i]; i++; } else { newArr[k] = arr2[j]; j++; } k++; } if (k < newArr.length && i == arr1.length) { for (; j < arr2.length; j++) { newArr[k++] = arr2[j]; } } if (k < newArr.length && j == arr2.length) { for (; i < arr1.length; i++) { newArr[k++] = arr1[i]; } } return newArr; }