常见的排序算法:
归并排序(MergeSort ):
对数组进行二分法分割,对分割后的数组分别进行排序,然后再将排好序的数组进行合并
public class MergeSort {
static int count = 0;
public static void main(String[] args) {
int[] array = {10,9,8,7,6,5,4,3,2,1};
array = mergeSort(array);
System.out.println(Arrays.toString(array));
System.out.println(count);
}
//二分法拆分数组
public static int[] mergeSort(int[] array){
//如果数组长度已经被拆分到了1个,那么返回该数组
if (array.length<2)
return array;
//选取中点
int mid = array.length/2;
//拆分后的左边部分
int[] left = Arrays.copyOfRange(array,0,mid);
//拆分后的右边部分
int[] right = Arrays.copyOfRange(array,mid,array.length);
//将拆分后的数组进行有序合并
return merge(mergeSort(left),mergeSort(right));
}
//将两部分各自有序的数组合并为一个数组
public static int[] merge(int[] left,int[] right){
//先确定合并后数组的长度
int[] result = new int[left.length+right.length];
//循环为结果数组赋值
for (int i = 0, j = 0, k = 0; k<result.length; k++){
count++;//统计循环次数,用于查看时间复杂度
//如果左右两边的其中一个数组已经全部放到了result中,那么我们只需要将剩余数组的内容按顺序放到result数组中
if (i >= left.length && j < right.length){
result[k] = right[j++];
}else if (i < left.length && j >= right.length){
result[k] = left[i++];
}
//如果两个数组都有剩余,那么我们就将两个数组中的当前最小值放入result中(当前这两个数组都是有序的)
else if (left[i] < right[j]){
result[k] = left[i++];
}else if (left[i] > right[j]){
result[k] = right[j++];
}
}
return result;
}
}