2021-03-07

快速排序

今天来写一下快速排序的代码;
测试数据 就自己编一下吧 哈哈哈
请输入您要进行排序的数据个数:11
请依次输入您要进行排序的数据:5 7 3 6 45 9 26 10 1 8 37
快速排序1 (以中间值为区分点)

#include<iostream> 
using namespace std;
void quicksort(int *p,int l,int s)
{
	int mid,temp;
	int i=l,j=s; 
	mid=p[(l+s)/2];//中间值 
	do
	{
		while(p[i]<mid)i++;//从最右边找比中间值小的数
		while(p[j]>mid)j--;//从最左边找比中间值大的数
		if(i<=j)//进行交换
		{
			temp=p[i];
			p[i]=p[j];
			p[j]=temp;
			i++;
			j--;
		}	
	}while(i<=j);
	if(i<s)quicksort(p,i,s);
	if(l<j)quicksort(p,l,j);
}
int main()
{
	//请输入您要进行排序的数据个数
	int n;
	cin>>n;
	int *p=new int[n+1]; 
	for(int i=1;i<=n;i++)
		cin>>p[i];
	quicksort(p,1,n);//调用函数 
	for(int i=1;i<=n;i++)
	{
		if(i!=n) 
		cout<<p[i]<<" ";
		else
		cout<<p[i];
	} 
	delete []p;//销毁数组 
	system("pause");
	return 0;
}

快速排序2 (以最左边值为比较值)

#include<iostream> 
using namespace std;
void quicksort(int *w,int left,int right)
{
	int i,j,t,temp;
	if(left>right)
		return;
	temp=w[left];//记录此时的最左边值
	//使用i 和 J分别记录左右大小
	i=left;
	j=right;
	while(i!=j)
	{
		while(w[j]>=temp&&i<j)//从最右边找比temp要小的数
			j--;
		while(w[i]<=temp&&i<j)//从最左边找比temp要大的数
			i++;
		if(i<j)//然后在i<j这一条件成立的情况下 进行数据交换
		{
			t=w[i];
			w[i]=w[j];
			w[j]=t;
		}
	}
	w[left]=w[i];//同时将此时最右边的值与此时的w[i]值进行交换
	w[i]=temp;
	quicksort(w,left,i-1);//继续调用函数本身进行排序
	quicksort(w,i+1,right);
	return ;
}
int main()
{
	int n;
		cin>>n;//输入要排序的数字个数
	int *w=new int [n+1];//使用new关键字创建动态数组
	for(int i=1;i<=n;i++)
		cin>>w[i];
	quicksort(w,1,n);//函数调用
	for(int i=1;i<=n;i++)//对排序好的数据进行输出 末尾没有空格
	{
		if(i!=n)
			cout<<w[i]<<" ";
		else
			cout<<w[i];
	}
	delete []w;//对new关键字声明的动态数组进行销毁
	system("pause");
	return 0;
}

虽然只是写了一些曾经的东西,但是就当做是复习巩固吧,这也是成长的足迹吧!
谢谢喽!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值