package sort_1; public class MergeSort1 { //利用归并排序算法 public static void mergeSort(DataWrap[] data) { sort(data,0,data.length-1); } /** * * @param data 待排序的数组 * @param left 待排序的数组的第一个元素 * @param right 待排序数组的最后一个元素 */ private static void sort(DataWrap[] data, int left, int right) { if(left < right) { int center = (left+right)/2; sort(data,left,center); sort(data,center+1,right); merge(data,left,center,right); } } /** * 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序 * @param data 数组对象 * @param left 左数组元素的第一个元素的索引 * @param center center是左数组元素的最后一个索引,center+1是右数组元素的第一个元素的索引 * @param right 右数组的最后一个索引 */ private static void merge(DataWrap[] data,int left, int center, int right) { DataWrap[] tempArr = new DataWrap[data.length]; int mid = center +1 ; int third = left;//third 记录中间数组的索引 int temp = left; while(left<=center&&mid<=right) { if(data[left].compareTo(data[mid])<=0) { tempArr[third++] = data[left++]; } else { tempArr[third++] = data[mid++]; } } //剩余部分依次放入中间数组 while(mid<=right) tempArr[third++] = data[mid++]; while(left<=center) tempArr[third++] = data[left++]; //将中间数组中的内容复制拷回原数组中 //(原left~right范围的内容被复制回原数组) while(temp<=right) data[temp] = tempArr[temp++]; } public static void main(String[] args) { DataWrap[] data = new DataWrap[]{ new DataWrap(2,""), new DataWrap(5,""), new DataWrap(1,""), new DataWrap(3,""), new DataWrap(6,""), new DataWrap(9,""), new DataWrap(8,""), new DataWrap(4,""), new DataWrap(7,""), new DataWrap(0,""), new DataWrap(11,""), new DataWrap(10,""), }; MergeSort1.mergeSort(data); System.out.println(java.util.Arrays.toString(data)); } }