归并排序
归并排序
归并排序分成:分,并两大步骤,使用的分治的思想。
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。
伪代码
分割
分割需要用到递归。
public static int[] sort(int[] arr,int start,int end){
//递归函数出口
//计算分割线,可以根据
//划分
}
合并
合并两个相邻的数组
public static int[] merge(int[] left,int[] right){
//new一个数组对象result,用于保存合并后的结果
//两数组互相进行对比,把小的放到result
//把剩下的,放到result
}
java代码实现
public static int[] sort(int[] arr,int start,int end){
//递归出口
if (end-start<=0) return Arrays.copyOfRange(arr,start,end+1);
//分割线
int mid = (end+start) /2;
//左右分割,然后将分割的丢进去合并函数中
return merge(sort(arr,start,mid),sort(arr,mid+1,end));
}
public static int[] merge(int[] left,int[] right){
int i=0,j=0,k=0;
//保存结果是数组
int[] result = new int[left.length+right.length];
//两两对比
while (i<left.length && j<right.length) {
if (left[i] <= right[j]) result[k++] = left[i++];
else result[k++] = right[j++];
}
//剩下也放过去
while (i<left.length) result[k++] = left[i++];
while (j<right.length) result[k++] = right[j++];
return result;
}