归并排序
归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
排序基本思想是:
将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素,将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素,重复步骤2,直到所有元素排序完毕
速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列
归并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组
稳定 时间复杂度O(nlogn) n大时较好
public class MergeSort { /** * 静态方法功能:给一个给定的数组用归并排序法排序 * @param a:待排序数组 * @param begin:开始下标 * @param end:终止下标 */ public static void mergeSort(int a[], int begin, int end) { if (begin < end) { int a1[] = new int[end - begin + 1]; int begin0 = 0; int mid = (begin + end) / 2; mergeSort(a, begin, mid); mergeSort(a, mid + 1, end); int begin1 = begin; int begin2 = mid + 1; int end1 = mid; int end2 = end; for (int i = 0; i < a1.length; i++) { if (begin1 <= end1 && begin2 <= end2) { if (a[begin1] < a[begin2]) { a1[begin0] = a[begin1]; begin0++; begin1++; } else { a1[begin0] = a[begin2]; begin0++; begin2++; } } else break; } if (begin1 <= end1) { for (; begin0 < a1.length; begin0++) { a1[begin0] = a[begin1]; begin1++; } } else { for (; begin0 < a1.length; begin0++) { a1[begin0] = a[begin2]; begin2++; } } // 将排好序的结果填回原数组 for (int i = 0; i < a1.length; i++) { a[begin + i] = a1[i]; } } } public static void main(String[] args) throws Exception { int[] a = { 49, 38, 65, 97, 76, 13, 27, 49 }; mergeSort(a, 0, a.length - 1); for (int key : a) { System.out.format(" %d", key); } } }
相关推荐
nongfusanquan0 2020-08-18
Broadview 2020-07-19
数据与算法之美 2020-07-05
Masimaro 2020-06-21
wonner 2020-06-17
Oudasheng 2020-06-04
从零开始 2020-06-05
清溪算法君老号 2020-06-01
风吹夏天 2020-05-26
yangjingdong00 2020-05-11
Tips 2020-04-30
troysps 2020-04-26
ustbfym 2020-04-25
清溪算法君老号 2020-04-24
dushine00 2020-04-19
数据与算法之美 2020-04-18
wulaxiaohei 2020-04-17
nurvnurv 2020-04-16