算法篇之归并排序
来源:互联网 发布:男生衣服软件 编辑:程序博客网 时间:2024/06/05 10:53
**归并排序是建立在归并操作上采用分治法的一种排序算法。**
归并操作
将2个有序数列进行归并操作。比较2数列第一个数的大小,取小的放入合并数列并删除该数,直至一个数列为空,则将另一数列一次添加至合并数列。
MemeryArray(int[] a, int[] b,int[] c) { //两个数组归并操作 int len; int i, j, k; i = j = k = 0; while (i < a.length && j < b.length) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = a[j++]; } while (i < a.length) c[k++] = c[i++]; while (j < b.length) c[k++] = c[j++]; }
归并数列的时间复杂度为O(n)。对数组归并排序思路:递归的 每次将数组分为2组 直至各组为1个元素时,这些数组有序,然后再合并数组。
5434762362 54347 62362 54 347 62 362 5 4 3 47 6 2 3 62 5 4 3 4 7 6 2 3 6 2 5 4 3 47 6 2 3 26 45 347 26 236 34457 22366 223344567
上面是一个数组进行归并排序得分解步骤。
实现代码
调用:sex是排序得数组,tmp为中间数组mergeSort(sex, 0, sex.length-1,tmp);static void MemeryArray(int[] a, int first, int mid, int last, int[] tmp) { int i = first; int j = mid+1; int m = mid; int n = last; int k = 0; while ( i <= m && j <= n ) { if(a[i] <= a[j]) tmp[k++] = a[i++]; else tmp[k++] = a[j++]; } while (i <= m) tmp[k++] = a[i++]; while ( j <= n) tmp[k++] = a[j++]; /** * 复制归并数组 */ for (i = 0; i < k; i++) { a[first+i] = tmp[i]; } } static void mergeSort(int[] a, int first, int last, int[] b) { if(first < last) { int mid = (first+last)/2; mergeSort(a, first, mid, b); mergeSort(a, mid+1, last, b); MemeryArray(a, first, mid, last, b); } }
测试:创建随机数数组,排序成功。
效率:数组个数 时间(ms) 10 1 0 1 100 0 0 1 1000 8 2 1 10000 3 20 3 100000 21 25 24可以看
出,随着数组的增大,排序时间增加不大。定义时间复杂度N*logn。
阅读全文
0 0
- 算法篇之归并排序
- 算法基础之排序篇-归并排序
- 排序算法之归并
- 算法之归并排序
- 排序算法之归并
- 算法之归并排序
- 算法之归并排序
- 算法之归并排序
- 算法之归并排序
- 算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- TCP、UDP、IP 协议分析
- 朴素贝叶斯模型
- php面试题总结
- C# 调用外部程序
- Garland
- 算法篇之归并排序
- 第一天感受
- UVa1626 Brackets sequence
- ssh中自己初始化Spring
- HDU-1576 A/B (扩展欧几里得算法)
- vue调用其它页面
- hdu1800 Flying to the Mars
- 【目录】PAT乙级题解目录索引
- 常用数组方法总结