合并排序:
采用分治策略将待排序的元素分成大小大致相同的两个子集合,先对两个子集合进行排序,将排序好的子集合合并成排好序的集合。
其算法是复杂度T(n)=O(nlogn)
合并排序主要中主要是在merge()这个方法中进行了排序。mergesort()仅仅是对数组进行的划分。
import java.util.Arrays;
import java.util.Scanner;
public class MergeSort {
/**
* 合并排序
* 分治策略
* 将待排序的元素分成大小大致相同的两个子集合,先对两个子集合进行排序,将排序好的子集合合并成排好序的集合
* 复杂度T(n)=O(nlogn)
*/
public static void mergesort(int[] a, int left, int right) {
// int b[]=new int[right-left+1];
int i = (left + right) / 2;
if (left < right) {
mergesort(a, left, i);// 左边排序
mergesort(a, i + 1, right);// 右边排序
merge(a, left, i, right); // 合并排序并赋给原来的数组a
// copy(a,left,right);
}
}
public static void merge(int a[], int left, int i, int right) {
int k = 0;
int m = i + 1; // 右指针
int n = left; // 左指针
int b[] = new int[right - left + 1];
while (n <= i && right >= m) {
if (a[n] < a[m]) {
b[k++] = a[n++];
} else {
b[k++] = a[m++];
}
}
while (n <= i) { // 把左边数组剩余的数值放入数组b中
b[k++] = a[n++];
}
while (m <= right) { // 把右边数组剩余的数值放入数组b中
b[k++] = a[m++];
}
for (int j = 0; j < b.length; j++) { // 把b中的数组存入a中
a[j + left] = b[j]; // 这里的left值不是n的值
}
/*
* void copy(int a[],int b[],int left,int right){ int j=0;
* for(j=0;j<right-left+1;j++){ a[j+left]=b[j]; }
*/
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("输入数组的长度:");
int n = in.nextInt();
int a[] = new int[n];
for (int i = 0; i < n; i++) {
System.out.print("输入第" + (i + 1) + "个数");
a[i] = in.nextInt();
}
// MergeSort ms=new MergeSort();
// ms.mergesort(a, 0, a.length-1);
MergeSort.mergesort(a, 0, n-1);
System.out.println("排序结果是:");
System.out.println(Arrays.toString(a)); //输出数组a
}
}