C++实现快速排序

快速排序是一个递归的过程,只要能够实现一趟快速排序的算法,就可以利用递归的方法对一趟快速排序后的左右分区域分别进行快速排序。会时常出现面试和笔试题目中。

值得强调是:最好的情况是枢纽元素选取得当,每次都能均匀的划分序列。 时间复杂度O(nlogn),最坏情况是枢纽元素为最大或者最小数字,那么所有数都划分到一个序列去了 时间复杂度为O(n^2)。

排序思路:

源码:

#include<iostream>
using namespace std;

template<class T>
struct QuickSort
{
private:
	void swap(T &ra,T &rb)
	{
		T tmp;
		tmp = ra;
		ra = rb;
		rb = tmp;
	}
	void partition_dowhile(T *data,int len,int left,int right) //
	{
		if(data==nullptr||len<0||left<0||right>len)
		{
			cout<<"invalid parameter"<<endl;
			return;
		}

		int i_small = left;
		int i_big = right+1;
		if(i_small<i_big) 
		{
			do 
			{
				do //从左开始扫描
				{
					i_small++;

				}while(i_small<right&&data[i_small]<data[left]);

				do
				{
					i_big--;
				}while(i_big>left&&data[i_big]>data[left]);//从右边开始扫描

				if(i_small<i_big)
				{
					swap(data[i_small],data[i_big]); //交换
				}
			}while(i_small<i_big);

			swap(data[left],data[i_big]); //交换枢纽数据
			print(data,len);
			partition_dowhile(data,len,left,i_big-1);
			partition_dowhile(data,len,i_big+1,right);
		}

	}
	void partition_while(T *data,int len,int left,int right)
	{
		if(data==nullptr||len<0||left<0||right>len)
		{
		    cout<<"invalid parameter"<<endl;
			return;
		}

		int i_small=left+1;
		int i_big=right;

		if(i_small<=i_big) 
		{
			while(i_small<i_big) //从左边开始扫描
			{
				while(i_small<right&&data[i_small]<data[left])
				{
					i_small++;
				}

				while(i_big>left&&data[i_big]>data[left])//从右边开始扫描找
				{
					i_big--;
				}
				if(i_small<i_big)
				{
					swap(data[i_small],data[i_big]);
				}
			}
			swap(data[left],data[i_big]);//交换枢纽数据
			print(data,len);
			partition_while(data,len,left,i_big-1);
			partition_while(data,len,i_big+1,right);
		}

	}

	void partition_for(T *data,int len,int left,int right)
	{
		if(data==nullptr||len<0||left<0||right>len)
		{
			cout<<"invalid parameter"<<endl;
			return;
		}
		int i_small=left;
		if(left<right)
		{
			for(int index=left+1;index<=right;index++)
			{
				if(data[index]<data[left])
				{
					i_small++;
					if(i_small!=index)
					{
						swap(data[i_small],data[index]);
					}
				}
			}
			this->swap(data[i_small],data[left]);
			print(data,len);
			partition_for(data,len,i_small+1,right);
			partition_for(data,len,left,i_small-1);
		}
	}
public:
	void sort(T *data,int len) 
	{
		if(data==nullptr||len<0) 
		{
			cout<<"invalid parameter"<<endl;
			return;
		}
		partition_dowhile(data,len,0,len-1);
		this->print(data,len);
	}
	void print(T *data,int len)
	{
		cout<<"排序结果:";
		for(int i=0;i<len;i++)
		{
			cout<<"  "<<data[i];
		}
		cout<<endl;
	}
};

void main()
{
	int data[10]={5,4,9,6,1,3,7,2,8,10};
	
	QuickSort<int> quicksort;
	quicksort.sort(data,10);


	cin.get();
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值