基础排序:归并排序
算法实现:
- 划分左右数组
- 划分完后,从底下开始合并成一个数组
public class MergeSort {
public void mergeSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
mergeSort(arr,0,arr.length - 1);
}
private void mergeSort(int[] arr,int left,int right){
if(left == right){
return;
}
int mid = left + (right - left)/2;
//划分左边
mergeSort(arr,left,mid);
//划分右边
mergeSort(arr,mid+1,right);
//左右两边合并
merge(arr,left,mid,right);
}
private void merge(int[] arr,int left,int mid,int right){
//辅助数组
int[] help = new int[right - left + 1];
int i = 0;
int p1 = left;
int p2 = mid + 1;
//将左右两边的数根据大小顺序填进辅助数组
while(p1 <= mid && p2 <= right){
help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
//左边的数组多的部分直接填到后面
while(p1 <= mid){
help[i++] = arr[p1++];
}
//右边数组多的部分直接填到后面
while(p2 <= right){
help[i++] = arr[p2++];
}
//将辅助数组填到原数组
for (i = 0; i < help.length;i++) {
arr[left + i] = help[i];
}
}
//test:比较排序后的数组是否正确
public boolean compare(int[] arr){
//复制排序后的数组
int[] copy = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
copy[i] = arr[i];
}
//对复制的数组进行排序,一旦碰见不相等的就是排序出错了
Arrays.sort(copy);
for (int i = 0;i < arr.length;i++) {
if(arr[i] != copy[i]){
return false;
}
}
return true;
}
//test
public static void main(String[] args) {
//随机数组
int[] arr = new int[(int) ((100 + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((100 + 1) * Math.random()) - (int) (100 * Math.random());
}
MergeSort sort = new MergeSort();
sort.mergeSort(arr);
System.out.println(sort.compare(arr));
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}