排序算法之归并排序
2014-03-28 00:47
169 查看
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。值得注意的是归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
比较
归并排序是稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.代码
下面是我自己参考百度百科,然后用C/C++实现的代码://归并操作 void merge(int sourceArr[],int targetArr[],int startIndex,int midIndex,int endIndex) { //即两个有序的数组合并 int i = startIndex,j = midIndex + 1,k = startIndex; while(i <= midIndex && j <= endIndex) //有一个数组结束终止循环 { if(sourceArr[i] < sourceArr[j]) { targetArr[k++] = sourceArr[i++]; } else { targetArr[k++] = sourceArr[j++]; } } while(i <= midIndex) targetArr[k++] = sourceArr[i++]; while(j <= endIndex) targetArr[k++] = sourceArr[j++]; } //二路归并排序,采用分治法:用递归 void mergeSort(int sourceArr[],int targetArr[],int startIndex,int endIndex) { int midIndex ; int tempArr[100]; if(startIndex == endIndex) { //首尾索引相等了,说明要执行归并排序的区间为1了,也就是要排序的只有一个元素,此时不用排序 targetArr[startIndex] = sourceArr[startIndex]; } else { midIndex = (startIndex + endIndex) / 2; mergeSort(sourceArr,tempArr,startIndex,midIndex); //对左边进行归并排序 mergeSort(sourceArr,tempArr,midIndex + 1,endIndex); //对右边进行排序 merge(tempArr,targetArr,startIndex,midIndex,endIndex); //对左右进行合并 } //左右都排序好之后,进行合并 } int main() { int a[4]={50,10,30,20}; int b[4]; mergeSort(a,b,0,3); for(int i=0;i<sizeof(a)/sizeof(*a);i++) cout <<b[i] << ' '; cout<<endl; return 0; }
//时间和空间复杂度分析以及非递归代码。。。后续提供
相关文章推荐
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- 排序算法1——归并排序
- 常见排序算法(归并排序-曾经的笔记)
- 软考之排序算法(四)——归并排序、基数排序
- 排序算法之归并排序(Mergesort)解析
- 排序算法之归并排序
- 排序算法之快速排序和归并排序
- 排序算法——归并排序
- 【排序算法】归并排序(C++实现)
- 【排序算法】-归并排序
- 排序算法--归并排序
- 【排序算法】之归并排序
- 排序算法之归并排序(模板类)
- 排序算法——归并排序
- Pku acm 2299 Ultra-QuickSort 排序算法解题报告(四)----归并排序(MegerSort)求逆序数
- 基本排序算法及分析(五):归并排序
- 排序算法详解【归并排序-Merge_Sort】
- 排序算法(七):归并排序
- 排序算法——归并排序
- 排序算法详解【归并排序-Merge_Sort】