归并排序
1 package sort; 2 //归并排序 3 public class MergeSortTest { 4 public static void main(String[] args){ 5 int[] data = new int[]{5, 3, 6, 2, 1, 9, 4, 8, 7}; 6 mergeSort(data); 7 System.out.println("排序后的数组:"); 8 print(data); 9 } 10 11 public static void mergeSort(int[] data){ 12 sort(data, 0, data.length-1); 13 } 14 15 public static void sort(int[] data, int left, int right){ 16 if (left >= right) 17 return; 18 int center = (left + right) / 2; 19 sort(data, left, center); 20 sort(data, center+1, right); 21 merge(data, left, center, right); 22 print(data); 23 } 24 25 public static void merge(int[] data, int left, int center, int right){ 26 //临时数组 27 int[] tempArr = new int[data.length]; 28 //右边数组的第一个元素索引 29 int mid = center + 1; 30 //tempIndex记录临时数组的索引 31 int tempIndex = left; 32 //缓存左数组的第一个元素的索引 33 int tmp = left; 34 35 while(left <= center && mid <=right){ 36 if (data[left] <= data[mid]){ 37 tempArr[tempIndex++] = data[left++]; 38 }else{ 39 tempArr[tempIndex++] = data[mid++]; 40 } 41 } 42 43 //剩余部分依次放入临时数组(实际上两个while只会执行其中一个) 44 while (mid <= right){ 45 tempArr[tempIndex++] = data[mid++]; 46 } 47 48 while (left <= center){ 49 tempArr[tempIndex++] = data[left++]; 50 } 51 52 //将临时数组中的内容拷贝回原数组中 53 while (tmp <= right){ 54 data[tmp] = tempArr[tmp++]; 55 } 56 } 57 58 public static void print(int[] data){ 59 for(int i=0; i<data.length; i++){ 60 System.out.print(data[i]+" "); 61 } 62 System.out.println(); 63 } 64 }