分治排序
Description
排序算法每个同学都接触过,给你一个数组nums,请用分治的思想对nums进行升序排列。
Input
输入给定的数组nums,数字之间用空格隔开(1≤ nums.length ≤10000, -10000≤ nums[i]≤10000)
Output
输出排序后的升序数组,输出的数组中数字之间用空格隔开
Sample
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static int temp[] = null;
public static int sum = 0;
public static void main(String[]args) throws IOException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] strs = reader.readLine().split(" ");
int[] nums = new int[strs.length];
for (int i = 0; i < strs.length; i++) {
nums[i] = Integer.parseInt(strs[i]);
}
temp = new int[strs.length];
Main main = new Main();
main.mergesort(nums,0,nums.length-1);
for (int i = 0; i < nums.length - 1; i++) {
System.out.print(nums[i] + " ");
}
System.out.println(nums[nums.length - 1]);
reader.close();
return;
}
public static void mergesort(int[] nums,int left,int right){
if(left<right){
int mid = left+(right-left)/2;
mergesort(nums,left,mid);
mergesort(nums,mid+1,right);
merge(nums,left,mid,right);
}
}
public static void merge(int[] nums,int left,int mid,int right){
int i =left,j = mid+1,k = left;
//k表示辅助数组,保存对应位次
while (i<=mid&&j<=right){
if(nums[i]<=nums[j]){
temp[k++] = nums[i++];
}else{//这里为nums[i]>nums[j],因为第i个大于j个,则前半序列第i个后面也大于j,共有mid-i+1个
//同时由于j++,下一次前半序列和第j+1个相比,不会有重复
temp[k++] = nums[j++];
sum+= mid-i+1;
}
}
while (i<=mid){
temp[k++] = nums[i++];
}
while (j<=right){
temp[k++] = nums[j++];
}
i = left;
k = left;
while (k<=right){
nums[i++] = temp[k++];
}
}
}
思路
普通的归并排序