归并排序
来源:互联网 发布:美分知乎 编辑:程序博客网 时间:2024/06/03 20:07
基本思想:
归并排序用到了分治思想。归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
合并过程:
设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。
- j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标
- 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束
- //选取r[i]和r[j]较小的存入辅助数组rf
如果r[i]<r[j],rf[k]=r[i]; i++; k++; 转⑵
否则,rf[k]=r[j]; j++; k++; 转⑵ - //将尚未处理完的子表中元素存入rf
如果i<=m,将r[i…m]存入rf[k…n] //前一子表非空
如果j<=n , 将r[j…n] 存入rf[k…n] //后一子表非空 - 合并结束。
实现如下:
public class mergeSort {public static void main(String[] args) {// TODO Auto-generated method stubmergeSort ms = new mergeSort();int a[]={3,5,2,9,7,1,4};int n=a.length;int[] temp = new int[n];ms.mergeSort(a, temp, 0, n-1);for(int i=0;i<n;i++){System.out.println(a[i]);}}public void merge(int a[],int temp[],int leftPos,int rightPos,int rightEnd){int leftEnd = rightPos - 1;int tmpPos = leftPos;int length = rightEnd - leftPos + 1;for(;leftPos<=leftEnd&&rightPos<=rightEnd;++tmpPos){if(a[leftPos]<=a[rightPos]) temp[tmpPos] = a[leftPos++];elsetemp[tmpPos] = a[rightPos++];}//将剩下的左数组中的数据存到temp中while(leftPos<=leftEnd) temp[tmpPos++] = a[leftPos++]; //将剩下的右数组中的数据存到temp中while(rightPos<=rightEnd) temp[tmpPos++] = a[rightPos++];//把temp数组中数据再复制到a数组中for(int i=0;i<length;i++,rightEnd--)a[rightEnd] = temp[rightEnd];}public void mergeSort(int a[],int temp[],int left,int right){if(left < right){int center = (left + right)/2;mergeSort(a,temp,left,center);mergeSort(a,temp,center+1,right);merge(a,temp,left,center+1,right);}}}
分析:归并排序是稳定的,最坏时间复杂度和平均时间复杂度是o(nlogn)
参考资料:http://blog.csdn.net/hguisu/article/details/7776068
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- Activity 的启动模式
- Linux内核系统调用的添加
- GRAN论文翻译
- 【Linux】File 结构体,和 fd 的关系
- 大数据-Hadoop学习笔记09
- 归并排序
- spring中bean的配置
- 学习笔记之SharedPreference问题解答
- HDU
- IOS 动态获取键盘高度
- 使用DocumentFragment加快DOM渲染速度
- 大数据系列-scala类型定义
- 【数据结构】——-树和二叉树(一)
- java中堆和栈区别