排序(二)

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<stack>
using namespace std;


//快排非递归
int Pritation(vector<int>& vec, int left, int right)
{
	if (vec.size()==0 || left < 0 || right <= 0 || left >= right)
		return -1;
	int priot = vec[left];
	int i = left, j = right;
	while (i < j)
	{
		while (i < j&&vec[j] >= priot)
			j--;
		if (i<j)
			vec[i] = vec[j];
		while (i < j&&vec[i] <= priot)
			i++;
		if (i<j)
			vec[j] = vec[i];
	}
	vec[i] = priot;
	return i;
}
void QuickSort(vector<int>& vec, int left, int right)
{
	if (vec.size()== 0|| left < 0 || right <= 0 || left>right)
		return;
	stack<int>temp;
	int i, j;
	//(注意保存顺序)先将初始状态的左右指针压栈
	temp.push(right);//先存右指针
	temp.push(left);//再存左指针
	while (!temp.empty())
	{
		i = temp.top();//先弹出左指针
		temp.pop();
		j = temp.top();//再弹出右指针
		temp.pop();
		if (i < j)
		{
			int k = Pritation(vec, i, j);
			if (k > i)
			{
				temp.push(k - 1);//保存中间变量
				temp.push(i);  //保存中间变量 
			}
			if (j > k)
			{
				temp.push(j);
				temp.push(k + 1);
			}
		}

	}

}
//冒泡选择 插入 快排(非递归递归)  归并(递归非递归) 堆排序
void Heapify(vector<int>& vec,int len,int i){ //调整堆
	if (i >= len){
		return;
	}
	int leftpoint = 2 * i + 1;
	int rightpoint = 2 * i + 2;
	int max = i;
	if (leftpoint<len&&vec[leftpoint] > vec[max]){
		max = leftpoint;
	}
	if (rightpoint<len&&vec[rightpoint] > vec[max]){
		max = rightpoint;
	}
	if (max != i){
		swap(vec[max],vec[i]);
		Heapify(vec, len, max);
	}
}
void BuildHeap(vector<int>& vec){ //创建堆
	int len = vec.size()-1;
	int index = (len - 1) / 2;
	for (int i = index; i >= 0; i--){
		Heapify(vec,vec.size(),i);
	}
} 
void HeapSort(vector<int>& vec){
	BuildHeap(vec);
	for (int i = vec.size()-1; i >= 0; i--){
		swap(vec[i], vec[0]);
		Heapify(vec,i,0);
	}
}
int main(){
	/*任一节点的父节点是(i-1)/2
		子节点是2*i+1和 2*i+2
	*/
	vector<int> vec = {20,12,5,6,7,65,100};
	QuickSort(vec,0,vec.size()-1);
	for (int i = 0; i < vec.size(); i++){
		cout << vec[i] << " ";
	}
	cout << endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
排序二维vector可以使用sort函数结合自定义的比较函数来实现。比如,如果要按照二维数组的第二个关键字进行排序,可以使用以下代码: ```cpp sort(viA.begin(), viA.end(), \[\](const vector<int>& a, const vector<int>& b) { return a\[1\] < b\[1\]; }); ``` 这段代码会按照二维数组的第二个元素的大小进行排序,从小到大的顺序排列。如果要按照从大到小的顺序排列,只需要将比较函数中的`<`改为`>`即可。 另外,如果要按照二维数组的其他列进行排序,只需要将比较函数中的索引值修改为相应的列即可。例如,如果要按照第三列元素的大小进行排序,可以将`a\[1\]`和`b\[1\]`改为`a\[2\]`和`b\[2\]`。 除了使用lambda表达式,也可以定义一个比较函数来实现排序。例如: ```cpp bool cmp(const vector<int>& a, const vector<int>& b) { return a\[1\] < b\[1\]; } sort(viA.begin(), viA.end(), cmp); ``` 这段代码与前面的lambda表达式的效果是一样的。 综上所述,可以根据需要使用sort函数结合自定义的比较函数来对二维vector进行排序。 #### 引用[.reference_title] - *1* [二维vector数组排序问题](https://blog.csdn.net/qq_40788950/article/details/105500049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [c++ sort()函数对二维数组vector排序](https://blog.csdn.net/weixin_44153180/article/details/127867911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [sort函数进行二维vector的排序](https://blog.csdn.net/qq_27538633/article/details/124356194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值