快速排序算法

以最左边元素为枢轴的快速排序,最好情况时间复杂度为o(nlogn),最坏情况(原始序列已经有序)时间复杂度o(n2),平均情况下的时间复杂度o(nlogn).

#include<iostream>
using namespace std;
 void kuaipai(int *a,int l,int r)
 {
 	int i=l,j=r,x=a[l];
 	if(i<j)
 	{
 		while(i<j)
 		{
 			while(i<j&&a[j]>x)//从右到左寻找比x小的元素 
 			j--;
 			if(i<j)
 			a[i++]=a[j];//找到后将a[j]的值赋给a[i],然后i=i+1; 
 			while(i<j&&a[i]<x)//从左到右寻找比x大的元素 
 			i++;
 			if(i<j)
 			a[j--]=a[i];//找到后将a[i]的值赋给a[j],然后j=j-1; 
		 }
		 a[i]=x;/*当在当组内找完一遍以后就把中间数x回归*/
		 kuaipai(a,l,i-1);
		 kuaipai(a,i+1,r);
		 //最后可能会出现很多左右分支,直到每一组的i = j 为止*
	 }
 }
 main()
 {
 	int n;
 	cin>>n;
 	int *a=new int [n];
 	for(int i=0;i<n;i++)
 	cin>>a[i];
 	kuaipai(a,0,5);`
 	for(int i=0;i<n;i++)
 	cout<<a[i]<<' ';
 	cout<<endl;
 }

随机选择策略的快速排序,时间复杂度与原始序列是否有序无关。

#include<cstdlib>
#include <iostream>
using namespace std;
//用于实现数组成员交换的函数
template <class Type>
void Swap(Type &a,Type &b)
{
	Type c;c=a;a=b;b=c;
}
//用于划分左右数组的函数
//p为数组下界,r为上界
template <class Type>
int Partition(Type a[],int p,int r)
{
	int i=p,j=r+1;
	Type x=a[p];
	//将小于x的元素交换到左边区域
	//将大于x的元素交换到右边区域
	while(true)
	{
		while((a[++i]<x)&&(i<r));
		while(a[--j]>x);
		if(i>=j) break;
		Swap(a[i],a[j]);
	}
	a[p]=a[j];
	a[j]=x;
	return j;
}
 
//实现随机功能的函数
int Random(int p,int r)
{	
	return rand()%(r-p+1)+p;
}
 
//随机划分函数
template <class Type>
int RandomizedPartition(Type a[],int p,int r)
{
	//随机的从p至r中抽取一个数
	int i=Random(p,r);
	//将a[i]和a[p]交换
	Swap(a[i],a[p]);
	//调用划分函数
	return Partition(a,p,r);
}
//随机选择策略的快速排序主功能函数
template <class Type>
void QuickSort(Type a[],int p,int r)
{
   //p为数组下界,r为数组上界
	if(p<r)
	{
		//采用随机选择策略进行划分
		int q=RandomizedPartition(a,p,r);
		//对左半段排序
		QuickSort(a,p,q-1);
		//对右半段排序
		QuickSort(a,q+1,r);
	}
	else return;}

 
  main()
{
	int n;     
    cout<<"随机选择策略的快速排序 "<<endl<<"请输入要排序的数组大小:";
    cin>>n;
    int *a=new int[n];
    cout<<"输入要排序的数:"<<endl;     
    for(int i=0;i<n;i++)
		cin>>a[i];           //输入待排序数组       
    QuickSort(a,0,n-1);    
    cout<<"输出排好的数:"<<endl;       //输出排好序的数组
    for(int i=0;i<n;i++)
		cout<<a[i]<<' '; 	
    cout<<endl; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值