课件版本:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef int SortData;
void merge ( SortData InitList[ ], SortData mergedList[ ], int left, int mid, int right ) {
int i = left, j = mid+1, k = left;
while ( i <= mid && j <= right ) //两两比较将较小的并入
if ( InitList[i] <= InitList[j] ) {
mergedList [k] = InitList[i];
i++;
k++;
} else {
mergedList [k] = InitList[j];
j++;
k++;
}
while ( i <= mid ) {
mergedList[k] = InitList[i]; //将mid前剩余的并入
i++;
k++;
}
while ( j <= right ) {
mergedList[k] = InitList[j]; //将mid后剩余的并入
j++;
k++;
}
}
void MergePass ( SortData initList[ ], SortData mergedList[ ], int len,int n ) {
int i = 0;
while (i+2*len-1 <= n-1) {
merge( initList, mergedList, i, i+len-1, i+2*len-1);
i += 2 * len; //循环两两归并
}
if ( i+len <= n-1 )
merge( initList, mergedList, i, i+len-1, n-1);
else for ( int j = i; j <= n-1; j++)
mergedList [j] = initList[j];
}
void MergeSort ( SortData initList[ ], int n ) {
//按对象排序码非递减的顺序对表中对象排序
SortData tempList[n];
int len = 1;
while ( len < n ) {
MergePass ( initList, tempList, len ,n);
len *= 2;
MergePass ( tempList, initList, len ,n);
len *= 2;
}
}
int main() {
int A[100];
int N;
cout<<"Please input size:"<<endl;
cin>>N;
for(int i=0; i<N; i++) {
cin>>A[i];
}
MergeSort(A,N);
for(int i=0;i<N;i++){
cout<<A[i]<<" ";
}
return 0;
}
LeetCode版本:
class Solution {
vector<int> tmp;
void mergeSort(vector<int>& nums, int l, int r) {
if (l >= r) return;
int mid = (l + r) >> 1;
mergeSort(nums, l, mid);
mergeSort(nums, mid + 1, r);
int i = l, j = mid + 1;
int cnt = 0;
while (i <= mid && j <= r) {
if (nums[i] <= nums[j]) {
tmp[cnt++] = nums[i++];
}
else {
tmp[cnt++] = nums[j++];
}
}
while (i <= mid) {
tmp[cnt++] = nums[i++];
}
while (j <= r) {
tmp[cnt++] = nums[j++];
}
for (int i = 0; i < r - l + 1; ++i) {
nums[i + l] = tmp[i];
}
}
public:
vector<int> sortArray(vector<int>& nums) {
tmp.resize((int)nums.size(), 0);
mergeSort(nums, 0, (int)nums.size() - 1);
return nums;
}
};