按照自己的想法实现的归并排序,应该没什么问题
归并排序定义什么的我就不写了,直接看代码吧
普通数组写法:
#include <algorithm>
#include <iostream>
using namespace std;
void merge(int a[], int left, int right)
{
int *b = new int[right - left + 1]; // 临时数组
int mid = (left + right) / 2; // 中间点
int idx = 0;
int i = left; // 左边数组的起点
int j = mid+1; // 右边数组的起点
while(idx <= right) // 待合并的数组是左边和右边的部分
{
if(i > mid)
b[idx] = a[j++];
else if(j > right)
b[idx] = a[i++];
else{
if(a[i] < a[j])
b[idx] = a[i++];
else
b[idx] = a[j++];
}
idx ++;
}
for(int i = left; i <= right; i++) // 把合并后的数组赋值到a
a[i] = b[i-left];
delete []b; // 释放空间
}
void mergeSort(int a[], int i, int j)
{
if(i < j)
{
int m = (i + j) / 2;
mergeSort(a, i, m); // 排序左边部分
mergeSort(a, m+1, j); // 排序右边部分
merge(a, i, j); // 左右两边排好序就可以合并了
}
}
int main()
{
int n;
int a[100];
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
mergeSort(a, 0, n-1);
for(int i = 0; i < n; i++){
cout << a[i] << ' ';
}
cout << endl;
return 0;
}
vector写法:
#include <algorithm>
#include <iostream>
using namespace std;
vector<int> v;
void mergeSort( vector<int> & v )
{
// 排序部分
int n = v.size();
if(n <= 1) return;
vector<int> vb(v.begin(), v.begin() + n/2);
vector<int> ve(v.begin() + n/2, v.end());
mergeSort(vb);
mergeSort(ve);
// 合并部分
int idx, i, j;
idx = i = j = 0;
while(idx < n)
{
if(i < vb.size() && (j == ve.size() || vb[i] <= ve[j]) )
v[idx++] = vb[i++];
else
v[idx++] = ve[j++];
}
}
int main()
{
int n, num;
cin >> n;
for(int i = 0; i < n; i++){
cin >> num;
v.push_back(num);
}
mergeSort(v);
for(auto x : v){
cout << x << ' ';
}
cout << endl;
return 0;
}