交换排序算法

#include<iostream>
#include<vector>
using namespace std;


//冒泡排序
//每一趟从前往后两两比较,最终都会有一个最大的元素冒出来并放在最终的序列位置上,而且它们在同一端连续有序
//如果已经基本有序,则不需要移动
//时间复杂度:O(n^2)
//稳定排序算法
void sort1(vector<int> &vec)
{
	for (int i = vec.size() - 1; i >= 1; i--)
	{
		for (int j = 0; j <= i-1; j++)
		{
			if (vec[j] > vec[j+1])
			{
				int temp = vec[j + 1];
				vec[j + 1] = vec[j];
				vec[j] = temp;
			}
		}
	}
}

void Swap(int &a,int &b)
{
	int temp = a;
	a = b;
	b = temp;
}


int PartExchange(vector<int> &vec, int low, int high)
{
	int key_value = vec[low];
	while (low < high)
	{
		while (low < high && key_value <= vec[high])  // 从右向左找第一个小于key_value的数,并交换这两个值
			high--;
		Swap(vec[low], vec[high]);
		while (low < high && key_value >= vec[low])  // 从左向右找第一个大于key_value的数,并交换这两个值
			low++;
		Swap(vec[low], vec[high]);
	}
	return low;  //返回key_value的下标
}

void Qsort(vector<int> &vec, int low, int high)
{
	if (low < high)
	{
		int key=PartExchange(vec, low, high);
		Qsort(vec, low, key - 1);
		Qsort(vec, key, high);
	}
}

//快速排序
//1.每次总以当前表中第一个元素为基准,对表进行划分,比基准大的向右移动,比基准小的向左移动;
//2.分别对字表进行第一步操作,直至每个字表只有一个元素或为空;
//3.合并字表。
//特点:每一趟都会有一个元素即(基准)放在最终的位置上,而且左边全部小于它,右边全部大于它,但不一定连续有序,也不一定在一端上。
//理想情况下:每次划分后两边对称即正好将分成两个等长的子序列
//最坏情况下:基本有序或基本逆序即每次划分,只得到一个子序列,快排序反而蜕化为冒泡排序
//时间复杂度:O(nlogn)
//不稳定排序算法
void sort2(vector<int> &vec)
{
	Qsort(vec, 0, vec.size() - 1);
}


int main()
{
	vector<int> vec = { 3,7,5,8,2,1,9,4,6 };
	for (unsigned int i = 0; i <= vec.size() - 1; i++)
	{
		cout << vec[i] << " ";
	}
	cout << endl;
	sort1(vec);
	for (unsigned int i = 0; i <= vec.size() - 1; i++)
	{
		cout << vec[i] << " ";
	}

	system("pause>nul");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值