快速排序在各种面试中频繁用到,虽说道理比较简单,但是正确敲对有时候还真是一个问题,各版本教科书中的写法也层次不齐,现在贴出两个我比较欣赏的版本:
1. 把第一个元素座位枢轴元素,但是此时应该注意i<r的问题:
#include<iostream>
#include<stdio.h>
using namespace std;
int num[]={7,6,8,1,10,3,4,32,2,89};
int partition(int a[],int p,int r)
{
int i=p,j=r+1;
int x = a[p];
while(true)
{
while( a[++i]<x &&i<r );
while( a[--j]>x );
if( i>=j ) break;
swap( a[i],a[j] );
}
swap( a[p],a[j] );
return j;
}
void quicksort(int a[],int p,int r)
{
if(p<r)
{
int q=partition(a,p,r);
quicksort(a,p,q-1);
quicksort(a,q+1,r);
}
}
int main()
{
quicksort(num,0,9);
for(int i=0;i<10;i++)
printf("%d ",num[i]);
system("pause");
}
2. 第二个版本是把(i+j)/2作为枢轴元素,此时都不太需要注意边界,这一点比较好:
#include<iostream>
#include<stdio.h>
using namespace std;
//int num[]={7,6,8,1,10,3,4,32,2,89};
int num[]={1,2,3,4,5,6,7,8,9,10};
void quicksort(int a[],int l,int r)
{
int i=l,j=r,mid=a[(i+j)/2];
while(i<=j){
while(a[i]>mid) i++;
while(a[j]<mid) j--;
if(i<=j){
swap(a[i],a[j]);
i++;j--;
}
}
if( i<r ) quicksort(a,i,r);
if( j>l ) quicksort(a,l,j);
}
int main()
{
quicksort(num,0,9);
for(int i=0;i<10;i++)
printf("%d ",num[i]);
system("pause");
}