归并排序
2018-03-29 16:24
148 查看
1、算法思路(分治策略)
(1)划分:将待排序序列r1, r2, …, rn划分为两个长度相等的子序列r1, …, rn/2和rn/2+1, …, rn;(2)求解子问题:分别对这两个子序列进行排序,得到两个有序子序列;
(3)合并:将这两个有序子序列合并成一个有序序列。
2、代码实现
void mergeArray(int data[], int first, int mid, int last, int temp[])//一趟合并两个子序列 { int i = first, j = mid + 1, k = 1; while (i <= mid && j <= last) { if (data[i] <= data[j]) temp[k++] = data[i++]; else temp[k++] = data[j++]; } while (i <= mid) temp[k++] = data[i++]; while (j <= last) temp[k++] = data[j++]; for (i = 0; i < k - 1; ++i) //将排好的数据拷贝回去 data[first + i] = temp[i + 1]; //temp下标从1开始 } void mergeSort(int data[], int first, int last, int temp[]) { if (last > first) { int mid = (last + first) / 2; mergeSort(data, first, mid, temp); mergeSort(data, mid + 1, last, temp); mergeArray(data, first, mid, last, temp); } } int main(int argc, char *argv[]) { int data[20] = { 0, 1, 7, 3, 50, 43, 34, 78, 23, 67, 90 }; //第0个位置不用 int temp[20]; //第0个位置不用 mergeSort(data, 1, 10, temp); int i = 1; while (i <= 10) //输出 { cout << data[i] << ' '; ++i; } system("pause"); return 0; }
3、算法分析
3.1、空间复杂度 由于在合并两个子序列时,需要与原始记录序列同样数量的存储空间(即代码中的temp数组),因此其空间复杂性为O(n)。3.2、时间复杂度 1)归并需要进行logn趟; 2)每一次归并,不管多少个子序列进行两两合并,本质上所有的元素都需要参与比较,时间复杂性为O(n); 综上:时间复杂度为O(nlogn)。相关文章推荐
- 归并排序
- 排序:插入,希尔,堆,快速,归并排序
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
- C语言排序之归并排序篇
- 分治法(归并排序)
- 归并排序
- 排序算法整理之归并排序
- 归并排序--Java实现
- 归并排序
- 堆排序和归并排序
- poj 2299 Ultra-QuickSort(归并排序求逆序数)
- 归并排序和快速排序的衍生问题(一)
- MPI 归并排序
- 排序算法C++&&Python实现---归并排序
- JAVA数据结构 归并排序
- hdu 4911 归并排序求逆序数
- 分治思想的几个算法:二分检索、快排、归并排序
- 基于分治法的快速排序和归并排序
- 快速排序、希尔排序、插入排序、选择排序、归并排序、堆排序总结
- 归并排序