归并排序
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列 分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
代码实现:
public static void main(String[] args){
int[] a= new int[]{5, 4, 22, 2, 9, 1, 23, 17};
margeSort(a, 0, a.length-1);
System.out.print("最终排序结果:");
for(int i=0; i< a.length; i++){
System.out.print(a[i] + " ");
}
}
public static void margeSort(int [] arr, int start, int end){
int times = 0;
if(end == start + 1){
if(arr[start] > arr[end]){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
return;
} else {
int middle = (start + end) / 2;
margeSort(arr, start, middle);
margeSort(arr ,middle+1, end);
int low = start;
int low2 = middle + 1;
int index = 0;
int[] tempArr = new int[end - start+1];
while(low <= middle && low2 <= end){
times++;
// 从两个数组中取出最小的放入临时数组
if(arr[low] > arr[low2]){
tempArr[index++] = arr[low2++];
} else {
tempArr[index++] = arr[low++];
}
}
// 剩余部分依次放入临时数组(实际上两个 while 只会执行其中一个)
while(low <= middle){
tempArr[index++] = arr[ low++];
times++;
}
while(low2 <= end){
tempArr[index++] = arr[low2++];
times++;
}
int tempStar= start;
for(int i = 0; i< tempArr.length; i++){
arr[tempStar++] = tempArr[i];
}
}
System.out.print(start + "---" + end +": ");
for(int k=0; k< arr.length; k++){
System.out.print(arr[k] + " ");
}
System.out.print("次数:" + times);
System.out.println();
}