小白:c++ 插入、归并排序(辅修作业)

//插入排序
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值