快速排序

//快速排序(课本版本)
/*
步骤:
1.设置基准数(每个子序列的第 0个数)
2.up指针指向子序列的第 0个数
3.down指针遍历第 1~n-1 个数,当找到一个数比 x 小的时候(假设这个数为 a):up指针指向下一个数(假设这个数为 b),然后交换 a 和 b
4.down遍历完后,再把 【最终up指针指向的数】 与 【基准数 a[l]】 交换
5.递归基准数左边的子序列
6.递归基准数右边的子序列
*/ 
#include <iostream>
using namespace std;
int main()
{
	void qs(int a[],int l,int r);
	int n;
	int a[10];
	int i;
	cin>>n;
	for (i=0;i<n;i++)
		cin>>a[i];
		
	qs(a,0,n-1);
	
	for (i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
	return 0;
}

void qs(int a[], int l, int r)
{
	int x,up,down;
	up = l; 
	x = a[l];  //基准数 
	if (l<r)
	{
		for (down=l+1;down<=r;down++)
		{
			if (a[down]<x)  //找到比 基准数x 小的数。 
			{
				up++;  //up指针指向下一个数,然后再把【这个数】 与 【找到的比x小的数】 进行交换 
				int temp1;
				temp1 = a[up];
				a[up] = a[down];
				a[down] = temp1;
			}
		}
		
		//最后,把【up指针最后指向的数】 与 【基准数】 交换 
		int temp2;
		temp2 = a[up];
		a[up] = a[l];
		a[l] = temp2;
		
		qs(a, l, up-1);  //递归基准数左边的子序列 
		qs(a, up+1, r);  //递归基准数右边的子序列 
	}
}



//快速排序(网上找到的方法) 
#include <iostream>
using namespace std;

int n;

int main()
{
	int a[10];
	int x,i;
	void qs(int a[],int m,int n);
	cin>>n;
	for (i=0;i<n;i++)
		cin>>a[i];
	qs(a,0,n);
	for (i=1;i<=n;i++)  //注意,经过排序后,数组中的所有元素会向后移动一位,所以遍历是从 1~n 
		cout<<a[i]<<" ";
	cout<<endl;
	return 0;
}

void qs(int a[],int l,int r)
{
	int x,i,j;
	i=l;
	j=r;
	x=a[l];  //取子序列的第一个数为基准 
	if (l<r)
	{
		while (i<j)
		{
			while (i<j && x<=a[j]) //从右往左找第一个小于x的数
				j--;
				
			if (i<j) 
			{
				a[i]=a[j];  //把比x小的数放到前面 
				i++;
			}
			
			while (i<j && x>a[i])	//从左往右找第一个大于x的数
				i++;
				
			if (i<j) 
			{
				a[j]=a[i];  //把比x大的数放到后面 
				j--;
			}
		}
		a[i]=x;  
		qs(a,l,i-1);
		qs(a,i+1,r);
		
		//排序(递归)过程 
		for (int k=1;k<=n;k++)
			cout<<a[k]<<" ";
		cout<<endl;
		
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值