//插入排序
void insertSort(vector<int>& num) {
int lenth = num.size(), curValue = 0, j;
//i是当前的下标,j是可能需要往后移的数据
for (int i = 1; i < lenth; i++) {
curValue = num[i];
//从i左边一格开始遍历
j = i - 1;
//将大于的部分右移一格
while (j > -1 && num[j] > curValue) {
num[j + 1] = num[j];
j--;
}
//插入数据
num[j+1] = curValue;
}
}
//合并排序-按顺序合并
void combine(vector<int>& num, int left, int mid, int right) {
int lenthLeft = mid - left + 1,lenthRight=right-mid;
int curIndex = left;
vector<int> leftNum(lenthLeft);
vector<int> rightNum(lenthRight);
//创左右两个数组
int i= 0,j=0;
for (int a=left; a < mid+1; a++) {
leftNum[i++] = num[a];
}
for (int b = mid + 1; b < right + 1; b++) {
rightNum[j++] = num[b];
}
//遍历原数组left到right的位置,若左右任意一个数组遍历完,把剩下一个数组直接赋上去
//若两个数组都没遍历完,取小的那个作为原数组当前位置的值,i/j加一
i = 0;
j = 0;
for (; curIndex < right + 1; curIndex++) {
//若任意一个完成
if (i > lenthLeft - 1) {
for (; j < lenthRight; j++) {
num[curIndex++] = rightNum[j];
}
return;
}
else if (j > lenthRight - 1) {
for (; i < lenthLeft; i++) {
num[curIndex++] = leftNum[i];
}
return;
}
//若两个都没完成
else {
num[curIndex] = (leftNum[i] < rightNum[j]) ? leftNum[i++] : rightNum[j++];
}
}
}
//递归、分治大问题,注意抽象看问题,注重函数的作用!!!
void combineSort(vector<int>&num,int left,int right) {
if (left < right) {
int mid = (left+right)/2;
combineSort(num, left, mid);
combineSort(num, mid + 1, right);
combine(num, left, mid, right);
}
}
测试部分:
//测试
int main() {
int n;
cout << "请输入数据规模n,输入-1结束" << endl;
cin >> n;
while (n != -1) {
vector<int> nums1(n);
vector<int> nums2(n);
double averageTime1 = 0;
double averageTime2 = 0;
//10次随机数组+排序
for (int i = 0; i < 10; i++) {
cout << endl<<endl<<"第" << i + 1 << "次" << endl;
//随机
srand(time(NULL));
//创建数组
for (int i = 0; i < n; i++) {
nums1[i] = rand() % 50000;
nums2[i] = nums1[i];
}
//输出10个数据
cout << "以下为部分数据" << endl;
for (int i = 0; i < 10; i++) {
cout << nums1[i]<<" ";
}
//---------------------------------------------------------------------------------------------------------
//插入排序
//记录时间+排序
auto startTime1 = system_clock::now();
insertSort(nums1);
auto endTime1 = system_clock::now();
//当次时间加到总时间上
auto singleTime1 = duration_cast<microseconds>(endTime1 - startTime1);
averageTime1 += double(singleTime1.count()) * microseconds::period::num / (microseconds::period::den);
//排序后的数据
cout << endl<< "插入排序前10个数据" << " ";
for (int i = 0; i < 10; i++) {
cout << nums1[i] << " ";
}
//---------------------------------------------------------------------------------------------------------
//合并排序
//记录时间+排序
auto startTime2 = system_clock::now();
combineSort(nums2,0,n-1);
auto endTime2 = system_clock::now();
//当次时间加到总时间上
auto singleTime2 = duration_cast<microseconds>(endTime2 - startTime2);
averageTime2 += double(singleTime2.count()) * microseconds::period::num / (microseconds::period::den);
//排序后的数据
cout << endl << "归并排序前10个数据"<<" ";
for (int i = 0; i < 10; i++) {
cout << nums2[i] << " ";
}
cout << endl;
//---------------------------------------------------------------------------------------------------------
}
cout << endl;
//记录结果
cout << "规模为" << n << "时插入排序的平均时间:" << averageTime1 / 10 <<"s" << endl;
cout << "规模为" << n << "时归并排序的平均时间:" << averageTime2 / 10 << "s" << endl;
//输入数据
cout << "请输入数据规模n,输入-1结束" << endl;
cin >> n;
}
}
计时部分参考https://blog.csdn.net/leelitian3/article/details/81227986