首页 > 代码库 > 常用排序算法之——归并排序
常用排序算法之——归并排序
归并排序的原理:
如果数组的元素个数大于1,则:
将数组平均分为两部分;
左边的数组归并排序;递归
右边的数组归并排序;递归
将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果;返回
否则,数组元素个数为1时,已经有序;直接返回。
稳定排序。时间复杂度在最坏、最好、平均情况下都为O(N lgN),空间复杂度为O(N)。
代码:
1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 void mergeSortedArray(T src[], int first, int mid, int last, T tmp[]) 6 { 7 int i = first, j = mid + 1; 8 int idx = 0; 9 10 while(i <= mid && j <= last)11 {12 tmp[idx++] = src[i] < src[j] ? src[i++] : src[j++];13 }14 15 while(i <= mid)16 {17 tmp[idx++] = src[i++];18 }19 while(j <= last)20 {21 tmp[idx++] = src[j++];22 }23 24 for(i = 0; i < idx; ++i)25 {26 src[first + i] = tmp[i];27 }28 }29 30 template<typename T>31 void mergeSort(T src[], int first, int last, T tmp[])32 {33 if(first >= last)34 return;35 36 int mid = first + ((last - first) >> 1); //找到中间元素下标,将数组分为两部分37 38 mergeSort(src, first, mid, tmp); //排序左边子数组39 mergeSort(src, mid + 1, last, tmp);40 41 mergeSortedArray(src, first, mid, last, tmp); //合并,tmp为辅助数组,用于记录临时合并的结果42 }43 44 int main()45 {46 const int n = 5;47 48 int ia[n] = {1, 3, 6, 2, 4};49 int itmp[n];50 mergeSort(ia, 0, n - 1, itmp); //sort51 for(int i = 0; i < n; ++i)52 cout << ia[i] << ‘ ‘;53 cout << endl;54 55 double da[n] = {1.2, 3.4, 6.7, 2.3, 4.5};56 double dtmp[n];57 mergeSort(da, 0, n - 1, dtmp); //sort58 for(int i = 0; i < n; ++i)59 cout << da[i] << ‘ ‘;60 cout << endl;
61 return 0;
62 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。