【Data_Structure笔记6】排序算法之【二路归并排序】
2017-08-26 20:58
519 查看
/************************************************************************************************************************ 文件说明: 二路归并排序 *************************************************************************************************************************/ #include<iostream> #include<string> #include<string.h> using namespace std; /************************************************************************************************************************ 函数说明: 【1】Merge()函数的功能是将前后相邻的【两个有序表】归并为一个有序表的算法。 【2】该两段有序表A[Low....Mid]、A[Mid+1......High]存放在同一顺序表中相邻的位置上,先将它们复制到【辅助数组B中】。 每次从B中的两个段取出一个记录进行关键字的比较,将较小的关键字放入A中。 【3】当数组B中有一段超过其表长时,将另一段中的剩余部分直接复制到A中。 *************************************************************************************************************************/ template<typename ElemType>void MergeArray(ElemType arrayT[], int iLow, int iMid, int iHigh, ElemType pTempArray[]) { //【1】序列表的前后两端各自有序,将它们合并成一个有序的列表 int i = iLow; int j = iMid + 1; int k = 0; while (i<=iMid&&j<=iHigh) { if (arrayT[i]<= arrayT[j]) //【2】比较序列表前后两端中的元素 { pTempArray[k++] = arrayT[i++]; //【3】将较小的值复制到辅助数组pTempArray } else { pTempArray[k++] = arrayT[j++]; } }//while while(i<=iMid) //【4】若第一个表未检测完,复制 { pTempArray[k++] = arrayT[i++]; } while(j<=iHigh) //【5】若第二个表未检测完,复制 { pTempArray[k++] = arrayT[j++]; } for (i=0;i<k;i++) //【6】将排好序的序列复制到原始序列中,则原始序列为本次排序之后的结果 { arrayT[iLow + i] = pTempArray[i]; } } template<typename ElemType>void MergeSort(ElemType arrayT[], int iLow, int iHigh, ElemType pTempArray[]) { if (iLow<iHigh) { int iMid = (iLow + iHigh) / 2; //【1】从中间划分为两个子序列 MergeSort<int>(arrayT, iLow, iMid, pTempArray); //【2】对左侧的子序列进行递归排序 MergeSort<int>(arrayT, iMid + 1, iHigh, pTempArray); //【3】对右侧的子序列进行递归排序 MergeArray<int>(arrayT, iLow, iMid, iHigh, pTempArray); //【4】最终,将两个有序序列合并起来 } } /************************************************************************************************************************ 模块说明: 控制台应用程序的入口点 *************************************************************************************************************************/ int main(int argc,char* argv[]) { int arrayT[15] = {22,32,44,34,56,21,24,345,213,234,245,127,113,119,933}; int* pTempArray = (int*)std::malloc(15*sizeof(int)); //【1】定义一个辅助数组B memset(pTempArray,0,(15*sizeof(int))); MergeSort<int>(arrayT,0,14,pTempArray); std::cout<<"===================================================="<<std::endl; for(int i=0;i<15;i++) { std::cout<<pTempArray[i]<<std::endl; } std::system("pause"); return 0; }
相关文章推荐
- 【Data_Structure笔记3】排序算法之插入排序常见的三种算法
- 【Data_Structure笔记8】排序算法之【选择排序---堆排序】
- 【Data_Structure笔记5】排序算法之【选择类排序】
- 【Data_Structure笔记7】排序算法之【链式基数排序】
- 【Data_Structure笔记4】排序算法之【交换类排序】
- 【Data_Structure笔记11】查找算法之【二叉排序树】
- 【Data_Structure笔记12】查找算法之【基于二叉排序树的查找】
- 【Data_Structure笔记10】查找算法之【哈希查找或散列表查找法】
- 【Data Structure/Algorithm】排序之归并排序
- 【算法导论】笔记一(插入排序、归并排序、选择排序、Peek Finding、加法器、中英文字符串搜索)
- 【Data_Structure笔记9】查找算法之【顺序查找和折半查找】
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 算法之排序-----排序第二篇 归并排序
- Feature Selection: A Data Perspective --阅读笔记2 传统数据的特征选择算法
- 算法基础:排序(二)——归并排序——Python实现
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- [学习笔记]排序算法之插入排序
- 高效算法设计_再谈排序和检索(归并排序,逆序数对)
- 算法笔记_100:蓝桥杯练习 算法提高 三个整数的排序(Java)
- 【算法导论笔记】排序