排序(二)

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值