现在的位置: 首页 > 综合 > 正文

快速排序算法

2017年12月13日 ⁄ 综合 ⁄ 共 938字 ⁄ 字号 评论关闭

快速排序采用的思想是分治思想。

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

 

#include <iostream>
#define LEN 20
using namespace std;

	void inline swap(int &a,int &b)
	{
		if(a==b)
		{
			return ;
		}
		a=a^b ;
		b=a^b ;
		a=a^b ;
	}


	int Partition(int a[],int left,int right)
	{
		int pivot=right ;//默认最右边值为基准值
		int i=left ;
		int j=left ;
		for(j=left;j<right;j++)
		{
			if(a[j]<a[pivot])   //如果符号改为大于, 即实现了从大到小排列
			{
				swap(a[j],a[i++]) ;//理解这一步是关键 i为基准点,即i左边 (0——i-1)都为小于基准点的数字		}
			}
		}
			swap(a[i],a[pivot]) ;    //将本次分割的基准值放入a[i]处
			return i ;
	}


		void QuikSort(int n[],int left,int right)
		{
			int tmp ;
			if(left<right)
			{
				tmp=Partition(n,left,right) ;
				QuikSort(n,left,tmp-1) ;
				QuikSort(n,tmp+1,right) ; 
			}
		}

		int main(int argc,char **argv)
		{
			int n[]={ 12, 24, 12, 4, 9, 11, 34, 53,5,4,3,7,1,10,9,8,5,6,5,4};
			for(int m=0;m<LEN;m++)//排序前
				cout<<n[m]<<"," ;
			cout<<endl;
			QuikSort(n,0,19) ;
			for(int m=0;m<LEN;m++)//排序后
				cout<<n[m]<<"," ;
			cout<<endl;

			return 0 ;
		}

 

抱歉!评论已关闭.