二路归并排序
2015-05-16 11:18
190 查看
hello 你好放松放松发顺丰的说法都是付水电费水电费的说法适当放松的方式水电费水电费水电费时代发生的付水电费水电费水电费地方发送到水电费水电费算法水电费水电费算法速度付水电费速度付水电费水电费算法水电费水电费水电费沙发上地方是水电费水电费水电费水电费算法算法水电费杀毒分水电费杀毒付水电费算法水电费算法水电费算法算法水电费是方式发送到 是非颠倒
题目描述
使用归并排序对n个元素进行排序。题目分析
归并排序算法是用分治策略实现对n个元素进行排序的算法。其基本思想是:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
算法实现
#include <stdio.h> #define N 7 void merge(int a[],int left,int mid,int right); void mergeSort(int a[],int left,int right) { if (left < right) { int mid = (left+right)/2; // 从中间划分两个子序列 mergeSort(a,left,mid); // 对左侧子序列进行递归排序 mergeSort(a,mid+1,right); // 对右侧子序列进行递归排序 merge(a,left,mid,right); // 归并 } } // 一趟归并排序算法 int b ; void merge(int a[],int left,int mid,int right) { // 表a的两段a[left..mid]和a[mid+1..right]各自有序,将它们合并成一个有序表 for (int m=left;m<=right;m++) b[m] = a[m]; // 将a中所有元素复制到b中 for (int i=left,j=mid+1,k=i;i<=mid&&j<=right;k++) { if(b[i]<=b[j]) // 比较b的左右两段中的元素 a[k]=b[i++]; // 将较小值复制到a中 else a[k]=b[j++]; } while (i<=mid) a[k++]=b[i++]; // 若第一个表为检测完,复制 while (j<=right) a[k++]=b[j++]; // 若第二个表为检测完,复制 // 最后两个while循环只有一个会执行 } int main() { int a[] = {49,38,65,97,76,13,27}; mergeSort(a,0,N-1); for (int i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; }
复杂度分析
归并排序的时间主要分为“分-治-合”的时间。划分子序列是在常数时间内完成,最后的归并操作又可以在线性时间内完成。因此,对长度为n的元素序列进行归并排序的时间代价为归并排序时间复杂度为O(nlogn),空间复杂度为O(n),并且它是一种稳定的排序方法。
PS:如果在待排序列中有两个记录Ri和Rj,它们的关键字ki=kj,且在排序之前,记录Ri排在Rj前面,如果在排序之后,记录Ri仍在Rj的前面,则称所用的排序方法时稳定的。是否具有稳定性仅是对算法的性质的描述,而并不能代表算法的优劣。
相关文章推荐
- 二路归并非递归排序Java实现
- 二路归并排序
- 二路归并排序
- 二路归并排序
- 二路归并排序及其改进方法
- 微软笔试题 大型文件外部排序(二路归并和k路归并的实现和比较)
- 二路归并排序的Java实现
- 排序算法大集锦_二路归并排序_2&3(分治思想)
- 二路归并排序及数组中逆序对的计算
- 二路归并排序,利用递归,时间复杂度o(nlgn)
- 归并排序:二路归并
- 二路归并排序,C++代码实现
- 归并排序、二路归并排序
- 两种归并排序算法的实现:二路归并排序和基本归并排序(虚拟消除递归的二路归并排序)
- 名称:二路归并排序
- 数据结构-数组排序-二路归并-循环实现-C语言
- 数据结构 二路归并排序的实现
- 二路归并排序的java实现
- 第五篇:逆向之二路归并排序
- Linux C学习笔记-排序算法6-二路归并排序