归并排序

来源:互联网 发布:如何在淘宝提高销量 编辑:程序博客网 时间:2024/06/06 07:29

代码:

#include "stdafx.h"#include <iostream>#include <assert.h>using namespace std;//合并两个排好序的数组nArr[nStart, nMid]和nArr[nMid+1, nEnd]void Merge(int nArr[], int nStart, int nMid, int nEnd){    //申请一个长度相同的临时数组,元素初始化为0int *p_nTemp = new int[nEnd - nStart + 1];memset(p_nTemp, 0, (nEnd - nStart + 1) * sizeof(int));//设置两个游标指向两个子数组中的元素int nCur1 = nStart;int nCur2 = nMid + 1;int nTempIndex = nStart;//同时遍历两个子数组,依次放入临时数组中while ((nCur1 <= nMid) && (nCur2 <= nEnd)){if (nArr[nCur1] < nArr[nCur2]){p_nTemp[nTempIndex++] = nArr[nCur1++];}else{p_nTemp[nTempIndex++] = nArr[nCur2++];}}while (nCur1 <= nMid){p_nTemp[nTempIndex++] = nArr[nCur1++];}while (nCur2 <= nEnd){p_nTemp[nTempIndex++] = nArr[nCur2++];}//将临时数组中的元素赋值到原数组中for (int i=nStart; i<=nEnd; i++){nArr[i] = p_nTemp[i];}delete []p_nTemp;}//归并排序void MergeSort(int nArr[], int nStart, int nEnd){    assert(nArr != NULL && nStart >= 0 && nEnd >= 0);    if (nStart < nEnd)    {int nMid = (nStart + nEnd) >> 1;MergeSort(nArr, nStart, nMid);//对数组的前半部分进行归并排序MergeSort(nArr, nMid+1, nEnd);//对数组的后半部分进行归并排序        Merge(nArr, nStart, nMid, nEnd);//合并两个排好序的数组    }}int _tmain(int argc, _TCHAR* argv[]){int nArr[5] = {7,5,6,4,8};    MergeSort(nArr, 0, 4);for (int i=0; i<5; i++){cout << nArr[i] << " ";}cout << endl;system("pause");return 0;}



 


 

原创粉丝点击