- 归并排序代码(注释见下):
- 把长度为
n
的输入序列分成两个长度为n/2
的子序列; - 对这两个子序列分别采用归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列。
public class Main {
void mergeSort(int[] a, int left, int right, int[] temp){
if(left < right){
int mid = left + (right - left)/2;
mergeSort(a, left, mid, temp);
mergeSort(a, mid + 1, right, temp);
merge(a, left, mid, right, temp);
}
}
void merge(int[] a, int left, int mid, int right, int[] temp){
int i = left;//左半区间
int j = mid + 1;//右半区间
int k = 0;//临时数组的索引
while(i <= mid && j <= right){
//合并两个数组
if(a[i] <= a[j]){
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
//如果左半没处理完,直接加入
while(i <= mid){
temp[k++] = a[i++];
}
//如果右半没处理完,直接加入
while(j <= right){
temp[k++] = a[j++];
}
k = 0;
while(left <= right){
a[left++] = temp[k++];
}
}
}
- 测试用例
public class Main {
public static void main(String[] args) {
int[] a = {8,4,5,7,1,3,6,2};
int temp[] = new int[a.length];//归并排序需要有一个额外的空间
mergeSort(a, 0, a.length - 1, temp);
for(int i = 0; i < a.length; i++){
System.out.print(a[i] + " ");
}
//System.out.println(Arrays.toString(a));
//Arrays.toString()方法是方便数组类型输出,不用使用for遍历数组
}
static void mergeSort(int[] a, int left,int right,int[] temp){
if(left < right){
int mid = left + (right - left)/2;
mergeSort(a, left, mid, temp);
mergeSort(a, mid + 1, right, temp);
merge(a, left, mid, right,temp);
}
}
static void merge(int[] a, int left, int mid, int right, int[] temp){
int i = left;
int j = mid + 1;
int k = 0;
while(i <= mid && j <= right){
if(a[i] <= a[j]){
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
while(i <= mid){
temp[k++] = a[i++];
}
while(j <= right){
temp[k++] = a[j++];
}
k = 0;
while(left <= right){
a[left++] = temp[k++];
}
}
}
输出结果
(1)Arrays.toString(a)
输出结果:
(2)for
循环输出结果: