归并排序算法
来源:互联网 发布:大数据商业计划书 编辑:程序博客网 时间:2024/06/18 01:42
归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来。
在合并两个数列,只要从比较两个数列的第一个数,谁小就先取谁,取了之后就在对应数列中删除这个数。然后再比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。
//将有序数组a[]和b[]合并到c[]中 void MemeryArray(int a[], int n, int b[], int m, int c[]) { int i, j, k; i = j = k = 0; while (i < n && j < m) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; } while (i < n) c[k++] = a[i++]; while (j < m) c[k++] = b[j++]; }如何让这两个数组组内数据有序?
可以将A,B各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以。
这样通过先递归的分解数列,再合并数列就完成了归并排序。
//将有二个有序数列a[first...mid]和a[mid...last]合并。 void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid + 1, last, temp); //右边有序 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 } } bool MergeSort(int a[], int n) { int *p = new int[n]; if (p == NULL) return false; mergesort(a, 0, n - 1, p); delete[] p; return true; }
归并排序的效率比较高,设数列的长度为N,将数列分成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),共为O(logN*O(N)).。
阅读全文
0 0
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 3个while循环
- js中获取时间new Date()详细介绍
- hdu 3652 B-number(数位dp)
- 给Android Studio设置代码字体大小与界面字体样式
- 最左原位
- 归并排序算法
- APUE读书笔记-第十三章-守护进程
- 4.3.2深度定时任务(TimerTask in Depth)
- 线程池学习笔记
- 如何成为一个及格的码农
- 剑指offer_第一个只出现一次的字符
- 常用图片格式介绍(了解
- leetcode 24 swapPairs
- from google.protobuf.internal import enum_type_wrapper ImportError: No module named google.protobuf