排序3

7.快速排序

快速排序采用分治法进行排序。基本思想为任取待排序的元素中的某个元素作为基准,按照该元素的排序码大小,将整个序列划分为两个子序列:左侧子序列中所有元素的排序码都小于基准元素的排序码,右侧子序列中所有元素的排序码都大于或等于基准元素的排序码,基准元素则排在这两个序列中间(这也是该元素最后安放的位置)。然后分别对这两个子序列重复施行上述方法,直到所有的元素都排在相应位置为止

 

实现代码如下

#include<iostream>
using namespace std;

int ar[] = {2,4324,65,21,45,57865,4,7,1,0};


int Partition(const int low, const int high);
void QuickSort(const int left, const int right)
{
	if(left < right)
	{
		int pivotpos = Partition(left, right);
		QuickSort(left, pivotpos-1);//分别对两个子序列进行排序
		QuickSort(pivotpos+1, right);
	}
}

int Partition(const int low, const int high)
{
	int pivotpos = low;
	int pivot = ar[low];
	for(int i=low+1; i<=high; ++i)
	{
		if(ar[i]<pivot)
		{
			++pivotpos;//每次都可以给low所指的元素找到其在序列中的精确位置
			if(pivotpos != i)
			{
				int j = ar[i];
				ar[i] = ar[pivotpos];
				ar[pivotpos] = j;
			}
		}
	}
	ar[low] = ar[pivotpos];
	ar[pivotpos] = pivot;

	cout<<"low = "<<low<<" high = "<<high<<" pivotpos = "<<pivotpos<<" ar["<<pivotpos<<"] = "<<ar[pivotpos]<<endl;
	cout<<endl;
	for(int i=0; i<sizeof(ar)/sizeof(ar[0]); ++i)
		cout<<ar[i]<<" ";
	cout<<endl;
	
	return pivotpos;
}

int main()
{
	for(int i=0; i<sizeof(ar)/sizeof(ar[0]); ++i)
		cout<<ar[i]<<" ";
	cout<<endl;
	QuickSort(0, 9);
	return 0;
}

 运行效果

 

 

 

 

 

posted @ 2019-12-05 19:19  C_hp  阅读(203)  评论(0编辑  收藏  举报