数据结构总结与实现:快速排序

数据结构总结与实现:快速排序

快速排序种类有很多,但核心思想是分治法,过程大致如下:
  1. 找到第一个元素(作为基准数)的位置(通过首尾标志与基准数交换的方法)
  2. 根据该基准数位置进行分块,分成两块,用递归的思想改变首尾标志再次排序,直到分完。

代码如下

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<stdlib.h>
#include<time.h>
using namespace std;

void Quicksort(int *p, int a, int b)
{
	int a1 = a, b1 = b;
	while (a < b)
	{
		bool flag = false;				//注意这种标志位方法,想让程序判断是否进入过判断,很常用的方法,
										//如果想让程序判断是否进入过循环,可以设置一个变量n在循环体内部,每次加一,最后看它为几就是进入了几次。

		while (!flag && a<b) {          //有时候分析不清条件的时候,就仔细想想是要两个成立还是任意一个就可以,两个就一定是&&,然后再考虑非不非的事情。
			if (p[a] > p[b])
			{
				flag = true;
				int temp = p[a];
				p[a] = p[b];
				p[b] = temp;
			}
			else
				b--;
		}
		flag = false;
		while (!flag && a<b) {
			if (p[a] > p[b])
			{
				flag = true;
				int temp = p[a];
				p[a] = p[b];
				p[b] = temp;
			}
			else
				a++;
		}
		if (a - 1 > a1)
			Quicksort(p, a1, a - 1);
		if (a + 1 < b1)
			Quicksort(p, a + 1, b1);
	}
}
int main()
{
	srand((int)time(0));
	int n, n1;
	cout << "输入随机元素个数 ";
	cin >> n;
	cout << "输入随机元素范围 ";
	cin >> n1;
	vector<int> arr(n);

	int n2 = 1;
	for (int i = 0; i < n; i++)   //产生随机正负数
	{
		int n3 = (rand() % 2);
		for (int j = 0; j < n3; j++)  //感觉这种产生随机负数的方法很蠢,可以再想想
			n2 *= -1;
		arr[i] = (rand() * n2 % n1);
	}
	cout << endl << "随机产生的数为 " << endl;
	for (int i = 0; i < n; i++)
		cout << arr[i] << " ";
	cout << endl;

	Quicksort(&arr[0], 0, n - 1);	//第2个参数表示第1个元素下标,第3个参数表示第2个元素下标。vector本身的标识符名虽然不是地址,但是可以通过取第一个元素地址得到首地址
	cout << endl << endl << "排序后的数为 " << endl;
	for (int i = 0; i < n; i++)
		cout << arr[i] << " ";
	cout << endl;
	system("pause");

	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值