归并排序

本文介绍归并排序的基本原理,其时间复杂度为O(nlgn),是一种稳定的排序算法。通过递归将数组分成子数组再合并,适用于JDK自带的排序方法中。当子数组长度小于一定值时,可以采用插入排序进行优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序,时间复杂度O(nlgn),相比快速排序和堆排序,优势是排序稳定。通过两两分拆、归并实现。在子数组长度小于等于7(一说50)时可采用插入排序来提高效率(但我在本机上测试,两者带来的提升并不明显)。JDK自带的Collections.sort方法采用的即是归并排序。

public class MergeSort {

private int[] temp;

public void sort(int arr[], int start, int to) {
if (arr == null || arr.length == 0 || start < 0 || end < 0) {
return;
}
if (start >= to) {
return;
}
int middle = (start + to) >> 1;
sort(arr, start, middle);
sort(arr, middle + 1, to);
merge(arr, start, middle, to);
}

public void merge(int[] arr, int start, int middle, int end) {
int index = start;
int from = start;
int to = middle + 1;
while (from <= middle && to <= end) {
if(arr[from]<=arr[to]){
temp[index++]=arr[from++];
}else{
temp[index++]=arr[to++];
}
}
while(from<=middle){
temp[index++]=arr[from++];
}
while(to<=end){
temp[index++]=arr[to++];
}
while(start<=end){
arr[start]=temp[start++];
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值