c++实现堆排序、快速排序、归并排序

本文深入探讨了三种常见的排序算法:堆排序、快速排序和归并排序。堆排序通过构建最大(或最小)堆实现排序;快速排序采用分治策略,通过选取基准元素进行划分;归并排序则利用合并两个已排序子序列的方法。这些算法各有优缺点,在不同场景下有不同的效率表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序

#include<iostream>
#include<vector>
using namespace std;
void adjust(vector<int>& v,int i,int index)
{
	int left = 2 * i + 1;
	int right = 2 * i + 2;
	int maxid = i;
	if (left <= index && v[left] > v[maxid]) maxid = left;
	if (right <= index && v[right] > v[maxid]) maxid = right;
	if (maxid != i)
	{
		swap(v[maxid],v[i]);
		adjust(v,maxid,index);
	}
}
void heapSort(vector<int>& v,int index)
{
	for (int i=index/2;i>=0;i--)
	{
		adjust(v,i,index);
	}
	for (int i=index;i>=1;i--)
	{
		swap(v[0],v[i]);
		adjust(v,0,i-1);
	}
}
int main()
{
	vector<int> v = {2,3,1,4,5,7,6};
	int index = v.size() - 1;
	heapSort(v, index);
	for (auto e:v)
	{
		cout << e << endl;
	}
}

快速排序

#include<iostream>
#include<vector>
using namespace std;
void quickSort(vector<int>& n,int left,int right)
{
	if (left >=right) return;
	int l = left;
	int r = right;
	int key = n[left];
	while (l<r)
	{
		while (n[r] >= key && l < r) r--;
		while (n[l] <= key && l < r) l++;
		if (l < r)
		{
			int temp = n[r];
			n[r] = n[l];
			n[l] = temp;
		}
	}
	n[left] = n[l];
	n[l] = key;
	quickSort(n, left, l - 1);
	quickSort(n, l + 1, right);
}
int main()
{
	vector<int> nums = {2,4,3,1,5,6};
	quickSort(nums, 0, nums.size() - 1);
	for (auto e:nums)
	{
		cout << e << endl;
	}
}

归并排序

#include<iostream>
#include<vector>
using namespace std;
void merge(vector<int>& v,int l,int mid,int r)
{
	int n = r - l + 1;
	vector<int> temp(n);
	int k = 0;
	int i = l;
	int j = mid + 1;
	while (i <= mid && j <= r) temp[k++] = v[i] <= v[j] ? v[i++] : v[j++];
	while (i <= mid) temp[k++] = v[i++];
	while (j <= r) temp[k++] = v[j++];
	for (int i=0;i<n;i++)
	{
		v[l+i] = temp[i];
	}
}
void mergeSort(vector<int> &v,int l,int r)
{
	if (l == r) return;
	int mid = (l + r) / 2;
	mergeSort(v, l, mid);
	mergeSort(v,mid+1,r);
	merge(v,l,mid,r);
}
int main()
{
	vector<int> v = {2,4,3,1,5,7,6};
	int n = v.size();
	mergeSort(v,0,n-1);
	for (auto e:v)
	{
		cout << e << endl;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值