归并排序

来源:互联网 发布:商家给淘宝发票抬头 编辑:程序博客网 时间:2024/06/18 12:42

Mark Allen Weiss的数据结构预算法分析,思路很清晰,用C++实现

#include <iostream>

#include<vector>
using namespace std;
class MS
{
public:
void mergesort(vector<int>&a,vector<int>&tmpArray,int left,int right);
void mergeSort(vector<int>&a);
void merge(vector<int>&a,vector<int>&tmpArray,int leftPos,int rightPos,int rightEnd);


};
void MS::mergeSort(vector<int>&a)
{
vector<int>tmpArray(a.size());
mergesort(a,tmpArray,0,a.size()-1);
};
void MS::mergesort(vector<int>&a,vector<int>&tmpArray,int left,int right)
{
if(left<right)
{
int center=(left+right)/2;
mergesort(a,tmpArray,left,center);
mergesort(a,tmpArray,center+1,right);
merge(a,tmpArray,left,center+1,right);
}
};
void MS::merge(vector<int>&a,vector<int>&tmpArray,int leftPos,int rightPos,int rightEnd)
{
int leftEnd=rightPos-1;
int tmpPos=leftPos;
int numElements=rightEnd-leftPos+1;
while(leftPos<=leftEnd&&rightPos<=rightEnd)
if(a[leftPos]<=a[rightPos])
tmpArray[tmpPos++]=a[leftPos++];
else
tmpArray[tmpPos++]=a[rightPos++];
while(leftPos<=leftEnd)
tmpArray[tmpPos++]=a[leftPos++];
while(rightPos<=rightEnd)
tmpArray[tmpPos++]=a[rightPos++];
for(int i=0;i<numElements;i++,rightEnd--)
a[rightEnd]=tmpArray[rightEnd];
};
int main()
{
MS m;
vector<int> ivec;
ivec.push_back(1);
ivec.push_back(9);
ivec.push_back(2);
ivec.push_back(10);
ivec.push_back(3);
ivec.push_back(11);
ivec.push_back(4);
ivec.push_back(12);
ivec.push_back(5);
ivec.push_back(13);
ivec.push_back(6);
ivec.push_back(14);

for(int j=0;j<ivec.size();j++)
cout<<ivec[j]<<endl;
m.mergeSort(ivec);
return 0;
}
原创粉丝点击