#include
/*快速排序算法-升序
最坏情况:O(n^2),最好情况: O(n.logn)
注意privot中枢纽元是放在right-1的位置
当数组比较小时,可选用插入排序
*/
void insertionSort(int a[],int n)
{
int j,p;
int temp;
for(p=1;p<n;p++)
{
temp=a[p];
for(j=p;j>0&&a[j-1]>temp;j–)
a[j]=a[j-1];
a[j]=temp;
}
}
void swap(int *p1, int *p2)
{
int temp;
temp=*p1,*p1=*p2,*p2=temp;
}
int pivotSelection(int a[],int left,int right)
/*pivot也可以用其他方法选择,这里用中值法*/
{
int center=(left+right)/2;
if( a[left] > a[center] )
swap( &a[left] ,&a[center]);
if( a[left] > a[right])
swap( &a[left], &a[right]);
if( a[center] > a[right] )
swap( &a[center], &a[right]);
swap( &a[center],&a[right-1]);
return a[right-1];
}
void qsort(int array[],int left,int right)
{
int i,j;
int pivot;
if(right-left>=2)/*若选插入排序,数组序号差可增大*/
{
pivot=pivotSelection(array,left,right);
i=left,j=right-1;
for(;;)
{
while( array[++i] < pivot)
{}
while( array[–j] > pivot)
{}
if(i<j)
swap(&array[i], &array[j]);
else
break;
}
swap( &array[i], &array[right-1]);
qsort( array,left,i-1);
qsort( array, i+1,right);
}
/* else
{
insertionSort(array+left,right-left+1);
}
*/
}
void main()
{
int s[]={3,5,76,333,2,75,200};
int i;
for(i=0;i<7;i++)
printf(“%d/n”,s[i]);
qsort(s,0,6);
printf(“——————/n”);
for(i=0;i<7;i++)
printf(“%d/n”,s[i]);
getchar();
}