快速排序

#include <iostream>
using namespace std;
#define  MAXSIZE  20          					
typedef struct
{
	int key;
	char *otherinfo;
}ElemType;
typedef struct
{
    ElemType *r;	         						
    int  length;            						
}SqList;
int flag=1;										
void Create_Sq(SqList &L)
{
	int i,n;
	cout<<"请输入数据个数,不超过"<<MAXSIZE<<"个。"<<endl;
	cin>>n;											
	cout<<"请输入待排序的数据:\n";
	while(n>MAXSIZE)
	{
		cout<<"个数超过上限,不能超过"<<MAXSIZE<<",请重新输入"<<endl;
		cin>>n;
	}
	for(i=1;i<=n;i++)
	{
		cin>>L.r[i].key;
		L.length++;
	}
}
void show(SqList L)
{
	int i;
	for(i=1;i<=L.length;i++)
		cout<<L.r[i].key<<" ";
	//cout<<endl;
}
int Partition(SqList &L,int low,int high,int flag)
{ //对顺序表L中的子表r[low..high]进行一趟排序,返回枢轴位置
	ElemType k=L.r[low];
	while(low<high)
	{
		while(low<high&&L.r[high].key>=k.key)
			high--;
		if(low<high)
			L.r[low++]=L.r[high];
		while(low<high&&L.r[low].key<=k.key)  //这个地方被坑了,符号注意下
			low++;
		if(low<high)
			L.r[high--]=L.r[low];
	}
	L.r[low]=k;
	cout<<"第 "<<flag<<" 趟排序 ";
	show(L);
	cout<<"中枢节点为:"<<L.r[low].key;
	cout<<endl;	
	
	return low;
}//Partition

void QSort(SqList &L,int low,int high)
{	//调用前置初值:low=1; high=L.length;
    //对顺序表L中的子序列L.r[low..high]做快速排序
	int pivotloc;
    if(low<high)
	{										//长度大于1
		pivotloc=Partition(L,low,high,flag++); 		//将L.r[low..high]一分为二,pivotloc是枢轴位置
		QSort(L,low,pivotloc);				//对左子表递归排序
		QSort(L,pivotloc+1,high);        	//对右子表递归排序
	}
}											//QSort请补齐代码

void QuickSort(SqList &L)
{
	
	//对顺序表L做快速排序
	QSort(L,1,L.length);
}											//QuickSort

void main()
{
	SqList L;
	L.r=new ElemType[MAXSIZE+1];
	L.length=0;
	Create_Sq(L);
	QuickSort(L);
	cout<<"排序后的结果为:"<<endl;
	show(L);
}

posted @ 2014-12-17 10:35  __夜风  阅读(249)  评论(0编辑  收藏  举报