归并排序的思想为分而治之。首先将整个数组,分为n份,每一份中有一个元素,之后两两合并,每一分钟有两个元素,排序,之后再两两合并,每一份中有四个元素,排序,最后直至合并完成,很明显是利用递归的思想来进行排序,代码如下:
class MergeSort {
public:
int* mergeSort(int* A, int n) {
// write code here
if(A == NULL)
return A;
merge(A, 0, n-1);
return A;
}
void merge(int* A, int left,int right){ //制定每一小份的起始位置
int mid;
if(left<right){
mid=left+(right-left)/2;
merge(A, left, mid); //不断地分解,递归,直到每一份中只有一个元素
merge(A, mid+1,right);
merges(A, left, mid, right); //之后开始从小到大对每一份进行排序
}
}
void merges(int* A, int left,int mid,int right){ //对合并的两份进行排序
vector<int> temp; //建立一个临时容器
int i=left,j=mid+1;
while(i<=mid&&j<=right){
if(A[i]<A[j]) temp.push_back(A[i++]); //从小到大将两份中的所有元素排序放入临时容器中
else temp.push_back(A[j++]);
}
while(i<= mid){
temp.push_back(A[i++]);
}
while(j<=right){
temp.push_back(A[j++]);
}
for(i=left,j=0;i<=right;i++,j++){ //之后将原数组的相应位置放入排序好的数字即可
A[i]=temp[j];
}
}
};