归并排序 import java.util.Arrays; /** * 归并排序--采用分而治之思想的算法应用 * @author Rocco_L */ public class MergetSort { public static void main(String[] args) { int arr[] ={8,4,5,7,1,3,6,2}; int temp[] = new int [arr.length]; //归并排序需要一个额外的空间 mergeSort(arr, 0, arr.length-1, temp); System.out.println("归并排序后"+ Arrays.toString(arr)); } //分+合的方法 public static void mergeSort(int [] arr , int left , int right , int [] temp){ if(left < right){ int mid =(left + right)/2; //向左递归进行分解 mergeSort(arr, left, mid, temp); //向右递归进行分解 mergeSort(arr, mid+1, right, temp); //合并 merge(arr, left, mid, right, temp); } } //合并的方法 /** * * @param arr 排序的原始数组 * @param left 左边有序序列的初始索引 * @param mid 中间索引 * @param right 右边索引 * @param temp 左中转数组 */ public static void merge(int []arr, int left , int mid , int right, int[] temp){ int i =left; //初始化 i 左边有序序列的初始索引 int j=mid+1; //初始化j 右边有序序列的初始化索引 int t =0; //指向temp数组的当前索引 //先把左右两边有序的数据按照规则填充到temp数组 //直到左右两边的有序序列,有一边处理完毕为止 while(i<=mid&&j<=right){ //如果左边的当前元素小于等于右边的当前元素,将左边的当前元素拷贝到临时数组 然后索引后移 if(arr[i]<=arr[j]){ temp[t] = arr[i]; t+=1; i+=1; }else{ temp[t] = arr[j]; t+=1; j+=1; } } //把有剩余数据的一边数据依次全部填充到temp while(i <= mid){ temp[t] = arr[i] ; t+=1; i+=1; } while(j<= right){ temp[t] = arr[j] ; t+=1; j+=1; } //将temp数据拷贝到arr t=0; int tempLeft = left; while(tempLeft <= right){ arr[tempLeft] = temp[t]; t+=1; tempLeft+=1; } } }