八大种必知排序算法(三) 归并排序算法、堆排序算法详解
来源:互联网 发布:iphone连接电脑软件 编辑:程序博客网 时间:2024/05/18 20:49
一、归并排序算法
基本思想:
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
归并排序示例:
合并方法:
设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。
1. j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标
2. 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束
3. //选取r[i]和r[j]较小的存入辅助数组rf
如果r[i]<r[j],rf[k]=r[i]; i++; k++; 转⑵
否则,rf[k]=r[j]; j++; k++; 转⑵4. //将尚未处理完的子表中元素存入rf
如果i<=m,将r[i…m]存入rf[k…n] //前一子表非空
如果j<=n , 将r[j…n] 存入rf[k…n] //后一子表非空5. 合并结束。
算法实现:
/**
* 归并排序
* 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
* 时间复杂度为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;
}
/**
* 将数组中low到high位置的数进行排序
* @param nums 待排序数组
* @param low 待排的开始位置
* @param mid 待排中间位置
* @param high 待排结束位置
*/
public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1];
int i = low;// 左指针
int j = mid + 1;// 右指针
int k = 0;
// 把较小的数先移到新数组中
while (i <= mid && j <= high) {
if (nums[i] < nums[j]) {
temp[k++] = nums[i++];
} else {
temp[k++] = nums[j++];
}
}
// 把左边剩余的数移入数组
while (i <= mid) {
temp[k++] = nums[i++];
}
// 把右边边剩余的数移入数组
while (j <= high) {
temp[k++] = nums[j++];
}
// 把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
nums[k2 + low] = temp[k2];
}
}
- 八大种必知排序算法(三) 归并排序算法、堆排序算法详解 (续)
- 八大种必知排序算法(三) 归并排序算法、堆排序算法详解
- 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解
- 八大排序算法-归并排序
- 八大排序算法--归并排序
- 八大排序算法-归并排序
- 八大排序算法(七)归并排序
- 八大排序算法-堆排序
- 八大排序算法--堆排序
- 八大排序算法-堆排序
- 八大排序算法总结之二(简单选择算法,堆排序,归并排序,基数排序)
- 八大排序算法总结之二(简单选择算法,堆排序,归并排序,基数排序)
- 八大排序算法(四)堆排序
- 八大排序算法(4) 堆排序
- 三大排序算法(快速排序,归并排序,堆排序)
- 三种排序算法(归并排序、快速排序,堆排序)
- 八大排序算法详解
- 八大排序算法详解
- IBM X3650 M4安装win 2008 Server操作指南
- Android UI 之ToggleTextView的妙用(自定义可切换TextView)
- mysql备份之xtrabackup
- openssl安装和使用总结
- [Phonegap+Sencha Touch] 移动开发62 使用GapDebug调试Phonegap/Cordova应用
- 八大种必知排序算法(三) 归并排序算法、堆排序算法详解
- JNI 与 NDK
- Timer和TimerTask在Android中的用法
- Android:继承ImageView 实现 圆角图片,圆形图片处理。
- VS2013导出的环境不能导入到VS2012中【解决方案】
- android 仿QQ好友动态 title滑动渐变
- Python基础学习笔记之二
- Linux apache+php+mysql
- 八大种必知排序算法(三) 归并排序算法、堆排序算法详解 (续)