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

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

上一篇:go快速排序


下一篇:常见排序算法——快速排序