归并排序 Java

归并排序针对于大列表数据的一种有效的排序。
归并排序的基本思想
将两个或两个以上的有序子列归并为一个有序的子列。
对于n个记录的顺序表,将这n个记录看作是叶子结点(leaf node),将两两归并的生成子表看作是他们的父节点(father node),则该归并过程对应于有叶子结点向根节点生成一颗二叉树的过程。
归并排序的趟数大约等于二叉树的高度-1,也即log n。

算法实现:
public void Merge(int[] data,int len) {
// 变量初始化
int m = 0;//临时数组的起始位置
int begin1 = 0, begin2 = 0;//有序表12的起始位置都初始化成0
int end1 = 0, end2 = 0;//有序表12的结束位置
int i = 0;//i为有序表1的索引
int j = 0;//j为有序表2的索引
int[] temporary = new int[data.length];//建立临时数组
while (begin1 + len < data.length) {
begin2 = begin1 + len;//第二个表的起始位置
end1 = begin2 - 1;//第一个有序表的结束位置
// 减1的原因是:数组从0开始,如果不减1则会发生ArraysIndexOutOfBoundsException 数组越界异常
end2 = (begin2 + len - 1 < data.length) ? begin2 + len - 1 : data.length - 1;
// 这个地方忘了的同学建议回顾一下java的基础语法
// 虽然我也是个菜鸡
i = begin1;
j = begin2;
// 将两个有序表的记录排序
while ((i <= end1) && (j <= end2)) {
if (data[i] < data[j]) {
temporary[m++] = data[i++];
} else {
temporary[m++] = data[j++];
}
}
while (i <= end1) {
temporary[m++] = data[i++];
}
while (j < end2) {
temporary[m++] = data[j++];
}
begin1 = end2 + 1;
}
i = begin1;

// 原顺序表中还有记录没有排序
while (i<data.length){
temporary[m++]=data[i++];
}
// 复制
// 因为现在排好序的是临时顺序表中的
for ( i = 0; i < data.length; i++) {
data[i]=temporary[i];
}
}
这里在归并增量中有一个len要注意:本人之前也因为这一点没有想明白这个算法的实现。
public int[] MergeSort(int[] data){
// 归并增量
int len=1;
while (len<data.length){
Merge(data,len);
len*=2;
}
return data;
}
这里最后提及一下关于归并的时间和空间复杂度:
时间复杂度为O(nlog n),空间复杂度为O(n),也可以叫做辅助空间;

下一篇将谈到我学数据结构遇到的难点和学习方法,也是对自己的一个总结。
拜谢!!!

好的,以下是归并排序Java代码实现: ```java public class MergeSort { public static void mergeSort(int[] arr, int left, int right) { if (left >= right) { return; } int mid = (left + right) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } public static void merge(int[] arr, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } for (int p = 0; p < temp.length; p++) { arr[left + p] = temp[p]; } } public static void main(String[] args) { int[] arr = {5, 1, 6, 3, 4, 2}; mergeSort(arr, 0, arr.length - 1); for (int i : arr) { System.out.print(i + " "); } } } ``` 归并排序的基本思想是将待排序的序列分成两部分,分别对两部分进行排序,然后将两部分合并成一个有序序列。在合并过程中,需要使用一个临时组来存储合并结果。 具体实现过程中,首先找到待排序序列的中间位置,然后递归地对左半部分和右半部分进行排序,最后将左半部分和右半部分合并成一个有序序列。合并过程中,使用两个指针分别指向左半部分和右半部分的起始位置,比较两个指针所指的元素大小,将较小的元素存入临时组中,并移动指针。最后将临时组中的元素复制回原组中。 以上是归并排序Java代码实现,希望能够帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值