归并排序
来源:互联网 发布:windows 7默认壁纸 编辑:程序博客网 时间:2024/06/06 10:59
思想
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
步骤
归并排序工作原理:(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素
2.将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
3.重复步骤2,直到所有元素排序完毕
归并操作
两个已经排序的数组,合并成一个排序的数组
/** * 两个有序数组进行归并 * A数组的两个部分low - mid,mid+1-high进行归并,这两部分都是有序的 * @param A * @param low * @param mid * @param high */ public void merge(int[] A,int low ,int mid ,int high){ int len = high - low + 1; int[] C = new int[len]; // 临时存放中间归并数组 int i=low; int j=mid+1; int k=0; while(i<=mid || j<=high){ if(i<=mid && j<=high){ if(A[i]<A[j]){ C[k]=A[i]; k++; i++; }else{ C[k]=A[j]; k++; j++; } }else if(i<=mid){ C[k] = A[i]; k++; i++; }else if(j<=high){ C[k] = A[j]; k++; j++; } } for(k=0;k<len;k++){ A[k+low] = C[k]; } }
排序操作
public void mergeSort(int[] A,int low,int high){ if(low>=high)// 停止归并 return; int mid = low + (high - low)/2; mergeSort(A,low,mid); mergeSort(A,mid+1,high); merge(A,low,mid,high); }
复杂度分析
(1)时间复杂度
时间复杂度与初始序列无关
归并操作的时间复杂度是
(2)空间复杂度
主函数
public static void main(String[] args){ int[] A = new int[]{49,38,65,97,76,13,27,49}; Print.printArray(A); MergeSort MergeSort = new MergeSort(); MergeSort.mergeSort(A,0,A.length-1); Print.printArray(A); }
输出
49 38 65 97 76 13 27 49 13 27 38 49 49 65 76 97
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- JAVA:三种集合LIST、SET、MAP
- CTS/GTS 测试指引
- viewpager实现轮播图效果
- LeetCode - 234. Palindrome Linked List
- 研发工作中芯片选型需要考虑的问题
- 归并排序
- Android应用性能优化之使用SparseArray
- Fragment 嵌套Fragment注意事项
- Linux学习之路--启动VNC服务
- 从tcp原理角度理解Broken pipe和Connection reset by peer的区别
- Thinking in Java 第6章 访问权限控制 【Java 访问权限修饰词】
- 序列化XML的类。包括向SQL传XML数据
- dojo学习之1
- FAQ-json字符串和json对象相互转换