首页 > 代码库 > [7] 算法之路 - 快速排序之3轴演算

[7] 算法之路 - 快速排序之3轴演算

左轴演算、中轴演算、右轴演算

题目:

快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。


快速排序 - 算法

1、快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二

2、分别对左边与右边数列进行排序


左轴演算:

// 快速排序 - 左轴演算
// 1. 附设两个指针left/right,并设最左端的数为最初枢轴pivot
// 2. 从右向左搜索,找到第一个比pivot小的数,将其缓存进枢轴位置
// 3. 从左向右搜索,找到第一个比pivot大的数,缓存进上一个比pivot小的数的位置程式进入2.循环
// 4. 最后一次交换后获得的有效空位置为a[i] ,此时再将pivot赋值给a[i] 此时a[i]左边的数比a[i]小,右边的数比a[i]大
//    再分别对其左边与左边进行快速排序
int QuickSort2(int a[],int left,int right)
{
	if(left<right)
	{
		int i = left,j=right,pivotloc=a[left];
		while(i < j)
		{
			while(i<j && a[j]>=pivotloc) j--;
			if(i<j) a[i++]=a[j];

			while(i<j && a[i]<pivotloc)i++;
			if(i<j) a[j--]=a[i];
			
		}
		a[i]=pivotloc;
		QuickSort2(a,left,i-1);
		QuickSort2(a,i+1,right);
	}
	return 0;
}
int QuickSort5(int a[],int left,int right)
{
	if(left<right)
	{
		int i = left,j=right,pivotloc=a[left];
		while(i < j)
		{
			while(i<j && a[i]<=pivotloc) i++;
			while(i<j && a[j]>pivotloc) j--;
			
			if(i<j)
			{
				SWAPER(a[i],a[j]);
				i++;j--;
			}
		}
		if(a[j]<a[left]) 
		{
			SWAPER(a[left],a[j]);
		}
		
		QuickSort5(a,left,j-1);
		QuickSort5(a,j,right);
	}
	return 0;
}

中轴演算

// 快速排序
int QuickSort3(int a[],int left,int right)
{
	int i,j,pivot;
	if(left<right)
	{
		pivot=a[(left+right)/2];
		i=left-1;
		j=right+1;
		while(i<j)
		{
			while(a[++i]<pivot) ;
			while(a[--j]>pivot) ;
			if(i<j) SWAPER(a[i],a[j]);
		}
		QuickSort3(a,left,i-1);
		QuickSort3(a,j+1,right);
	}
	
	return 0;
}


右轴演算

// 快速排序演算
// 1. 首先选择最右边的元素作为枢轴pivot
// 2. 从左向右搜索,寻找小于pivot的数,将其与左边第一个未交换的元素交换
// 3. 当搜索到最右边时,左边已交换的数都比pivot小,而未交换的都比pivot大
// 4. 将左边的第一个未交换的元素与最右边的pivot元素交换,并返回该未交换元素的索引

// 此时i左边的元素比i小,右边的比i大
// 程式进入.循环分别对0 →i -1  及最右边的i+1→right进行递归(快速排序) 最终该序列会变为有序
int Partition2(int a[],int left,int right)
{
	int i = left,j;
	int pivot=a[right];
	for(j=left;j<right;j++)
	{
		if(a[j]<pivot)
		{
			if(i!=j)SWAPER(a[i],a[j]);	
			i++;
		}
	}
	if(i!=right)SWAPER(a[i],a[right]);
	return i;
} 
int QuickSort4(int a[],int left,int right)
{
	int pivot;
	if(left<right)
	{
		pivot=Partition2(a,left,right);
		QuickSort4(a,left,pivot-1);
		QuickSort4(a,pivot+1,right);
	}
	return 0;
}