C++排序算法----------冒泡排序、插入排序、选择排序、快速排序、归并排序等算法记录

// 插入排序
// 从第二个元素,将其与它前面的元素比较,
// 如果前面的元素比该元素小,就将该元素插到前面,
// 如果前面元素比这个元素大,直接跳出
	void insertSort(vector<int>& nums)
	{
		for (int i = 1; i < nums.size(); i++)
		{
			int temp = nums[i];
			for (int j = i - 1; j >= 0; j--)
			{
				if (nums[j] > temp)
				{
					nums[j + 1] = nums[j];
					nums[j] = temp;
				}
				else break;
			}
		}
	}

调用时直接传递数组即可,插入排序个人理解是,从后往前插,自然就要有比较

故第一个循环 i 的下标初始值设为1,这样下标 1 前面还有下标 0 元素可以比较。

若理解有误,欢迎之争

	// 选择排序, 固定第一个,从第二个往后面的数都与第一个比较,小于他则交换,放到前面
	void selectSort(vector<int>& nums)
	{
		for (int i = 0; i < nums.size() - 1; i++)
		{
			
			for (int j = i + 1; j < nums.size(); j++)
			{
				if (nums[i] > nums[j])
				{
					int temp = nums[i];
					nums[i] = nums[j];
					nums[j] = temp;
				}
			}
		}
	}
	// 冒泡排序
	void bubbleSort(vector<int>& nums)
	{
		for (int i = 0; i < nums.size() - 1; i++)	//
		{
			for (int j = 0; j < nums.size() - i - 1; j++)	
                // 因为大的元素都冒泡交换到尾部了,所以nums - i - 1
			{
				if (nums[j + 1] < nums[j])	// 里面循环不断冒泡, 控制冒泡的相互的比较
				{
					int temp = nums[j + 1];
					nums[j + 1] = nums[j];
					nums[j] = temp;
				}
			}
		}
	}
// 归并排序,
/*===========================================
将数组不断两两划分,直至划分到一个元素为止
再进行合并,合并时比较头元素大小,放入新数组里面
最后将新数组赋给原始数据
============================================*/
	void merge(vector<int>& nums, int begin, int mid, int end, int temp[])
	{
		int i, j, k;
		i = k = begin;
		j = mid + 1;

		while (i <= mid && j <= end)
		{
			if (nums[i] > nums[j]) temp[k++] = nums[j++];
			else temp[k++] = nums[i++];
		}
		while (i <= mid) temp[k++] = nums[i++];
		while (j <= end) temp[k++] = nums[j++];
		for (int i = begin; i <= end; i++)
		{
			nums[i] = temp[i];
		}

	}

	void mergeSort(vector<int>& nums, int begin, int end)
	{
		int* temp = new int[nums.size()];
		if (begin < end)
		{
			int mid = (begin + end) / 2;
			mergeSort(nums, begin, mid);
			mergeSort(nums, mid + 1, end);
			merge(nums, begin, mid, end, temp);
		}
		delete []temp;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值