/*
**分治法与快速排序算法。数组array[p,q]
**1、Divide: 选中数组最左边的起始元素,所有小于起始元素的值都复制到存放起始元素的左边,
** 所有大于起始元素的值都存放到起始元素的右边,并返回起始元素所在的位置r。
**2、Conquer: 对[p,r)以及[r+1,q)分别递归调用快速排序算法,直到p==q,不在划分,直接返回。
**
**3、Combine: do nothing
*/
int * partition(int *p,int *q)//获得分割点的位置。
{//以*p为参考值,less指向已搜索的最后一个小于等于*p的元素。more为遍历指针。
//为了保证less指向的是已搜索的最后一个小于等于*p的元素,要求less之前的值全部小于*p,less到more之间的值全部大于*p
int *less,*more;
less=p;
more=p+1;
while(more<q)
{
if(*more>*p) //应该放在less的右边
more++;
else //应该放到less的左边
{
//交换less+1和more所指向的内容,并将less指向当前最后一个小于等于*p的值,即less++
less++;
int tmp; //注意不能使用异或的方式实现数据交换,因为此时less和more可能指向同一内存单元。
tmp=*less;
*less=*more;
*more=tmp;
more++;
}
}
int tmp=*less; //交换比较元素和最后一个小于交换元素的位置,使得所有小于交换元素的数据都在其左边......
*less=*p;
*p=tmp;
return p;
}
void quick_sort(int *p,int *q)
{
if(p==q)
return;
int * r=partition(p,q);
quick_sort(p,r);
quick_sort(r+1,q);
}
int _tmain(int argc, _TCHAR* argv[])
{
int num[5];
printf("input 5 numbers:\n");
int i=0;
for(i=0;i<5;i++)
scanf("%d",num+i);
printf("the numbers input are:\n");
for(i=0;i<5;i++)
printf("%d ",num[i]);
putchar('\n');
quick_sort(num,num+5);
printf("the numbers ordered are:\n");
for(i=0;i<5;i++)
printf("%d ",num[i]);
getchar();
getchar();
return 0;
}