JAVA的归并排序
2015-10-31 16:22
253 查看
同上篇一致,归并算法也是在笔试与面试中容易考查的一部分,为了面试我可是煞费苦心,看了很多博客,试了很多代码,终于找到一个容易理解与记忆的
这是归并排序的原文地址:http://blog.csdn.net/middlekingt/article/details/8446552
这是另外一位大神的代码,面试啊面试。。
以下为源代码,只是贴出来让自己看看:
package demo;
import java.util.Arrays;
public class Mergesort {
/**
* 归并排序
* 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
* 时间复杂度为O(nlogn)
* 稳定排序方式
* @param nums 待排序数组
* @return 输出有序数组
*/
public static int[] sort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 左边
sort(nums, low, mid);
// 右边
sort(nums, mid + 1, high);
// 左右归并
merge(nums, low, mid, high);
}
return nums;
}
public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int left = low;// 左指针
int right = mid + 1;// 右指针
int k = 0;
// 把较小的数先移到新数组中
while (left <= mid && right <= high) {
if (nums[left] < nums[right]) {
temp[k++] = nums[left++];
} else {
temp[k++] = nums[right++];
}
}
// 把左边剩余的数移入数组
while (left <= mid) {
temp[k++] = nums[left++];
}
// 把右边边剩余的数移入数组
while (right <= high) {
temp[k++] = nums[right++];
}
// 把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
nums[k2 + low] = temp[k2];
}
}
// 归并排序的实现
public static void main(String[] args) {
int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };
Mergesort.sort(nums, 0, nums.length-1);
System.out.println(Arrays.toString(nums));
}
}
归并排序的算法我们通常用递归实现,先把待排序区间[low,high]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并(merge)成有序的区间[low,high]。
该代码的归并过程为:比较nums[left]和nums[right]的大小,若nums[left]≤nums[right],则将前半表中的元素nums[left]复制到temp[k]中,并令left和k分别加上1;否则将第二个有序表中的元素nums[right]复制到temp[k]中,并令right和k分别加上1,如此循环下去,直到前半表取完,然后再将后半表中剩余的元素复制到temp中从下标k到下标t的单元。再用零时表(temp)覆盖现有表(nums)。
其实原作者还有很多不错的博客,有时间再去围观围观。
这是归并排序的原文地址:http://blog.csdn.net/middlekingt/article/details/8446552
这是另外一位大神的代码,面试啊面试。。
以下为源代码,只是贴出来让自己看看:
package demo;
import java.util.Arrays;
public class Mergesort {
/**
* 归并排序
* 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
* 时间复杂度为O(nlogn)
* 稳定排序方式
* @param nums 待排序数组
* @return 输出有序数组
*/
public static int[] sort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 左边
sort(nums, low, mid);
// 右边
sort(nums, mid + 1, high);
// 左右归并
merge(nums, low, mid, high);
}
return nums;
}
public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int left = low;// 左指针
int right = mid + 1;// 右指针
int k = 0;
// 把较小的数先移到新数组中
while (left <= mid && right <= high) {
if (nums[left] < nums[right]) {
temp[k++] = nums[left++];
} else {
temp[k++] = nums[right++];
}
}
// 把左边剩余的数移入数组
while (left <= mid) {
temp[k++] = nums[left++];
}
// 把右边边剩余的数移入数组
while (right <= high) {
temp[k++] = nums[right++];
}
// 把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
nums[k2 + low] = temp[k2];
}
}
// 归并排序的实现
public static void main(String[] args) {
int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };
Mergesort.sort(nums, 0, nums.length-1);
System.out.println(Arrays.toString(nums));
}
}
归并排序的算法我们通常用递归实现,先把待排序区间[low,high]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并(merge)成有序的区间[low,high]。
该代码的归并过程为:比较nums[left]和nums[right]的大小,若nums[left]≤nums[right],则将前半表中的元素nums[left]复制到temp[k]中,并令left和k分别加上1;否则将第二个有序表中的元素nums[right]复制到temp[k]中,并令right和k分别加上1,如此循环下去,直到前半表取完,然后再将后半表中剩余的元素复制到temp中从下标k到下标t的单元。再用零时表(temp)覆盖现有表(nums)。
其实原作者还有很多不错的博客,有时间再去围观围观。
相关文章推荐
- Java如何发送Email/邮件
- Java入门(1)
- Java注解
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程
- JAVA中重写equals()方法为什么要重写hashcode()方法说明
- JAVA的快速排序
- Java并发编程:volatile关键字解析
- eclipse使用技巧
- Java Servlet原理学习(二)
- Java命名规范与注释规范
- Java Servlet原理学习(一)
- Java Serialization序列化与反序列化
- 使用<a>标签调用struts2的action、传递动态参数、以及参数中出现加号等特殊字符的处理方法
- Java泛型
- Java多线程通信
- String-------字符串的排列+字符串的旋转(Java)
- Java如何使用比较器?
- java使用Jdom实现xml文件写入操作实例
- 【转】ListView多种类型优化,Java内存泄露的理解和解决,Handle造成内存泄露解决方法合集