关于快速排序同样用到了我前边提到的那个二分法,我理解的快速排序的关键是将一个数组分为3部分,我们标记的元素作为单独的数组,里边只有一个元素,大于或者等于这个元素的数组作为另一部分,而小于这个元素的部分作为剩下的一部分,那么实现的关键就是不断的二分,直至只剩下1个元素的时候终止,然后回溯,利用递归,从而找到我们需要的部分,那么实现的关键是什么,当然是数组的如何划分部分,如何将数组化为3部分,这个则是快速排序的精华部分,同样,还是直接代码。。。
C语言:
Codee#12906
#include <stdio.h>
int partition( int * a , int p , int r)
{
int x , temp;
int i , j;
x = a [ r ];
i =p - 1;
j =p;
for(; j < r; j ++) //初始化
{
if( a [ j ] <= x) //如果小于我们标记的元素就交换
{
i ++;
temp = a [ i ];
a [ i ] = a [ j ];
a [ j ] = temp;
}
}
temp = a [ i + 1 ]; //将中间值与我们标记的那个值进行交换。。
a [ i + 1 ] = a [ r ];
a [ r ] = temp;
return i + 1;
}
void quicksort( int * a , int p , int r) //快排
{
int q;
if(p < r)
{
q = partition( a ,p , r);
quicksort( a ,p , q - 1);
quicksort( a , q + 1 , r);
}
}
int main()
{
int a [ 100 ];
int n;
int i;
while( scanf( "%d" , &n))
{
for( i = 1; i <=n; i ++)
{
scanf( "%d" , & a [ i ]);
}
quicksort( a , 1 ,n);
for( i = 1; i <=n; i ++)
{
printf( "%d " , a [ i ]);
}
}
return 0;
}
int partition( int * a , int p , int r)
{
int x , temp;
int i , j;
x = a [ r ];
i =p - 1;
j =p;
for(; j < r; j ++) //初始化
{
if( a [ j ] <= x) //如果小于我们标记的元素就交换
{
i ++;
temp = a [ i ];
a [ i ] = a [ j ];
a [ j ] = temp;
}
}
temp = a [ i + 1 ]; //将中间值与我们标记的那个值进行交换。。
a [ i + 1 ] = a [ r ];
a [ r ] = temp;
return i + 1;
}
void quicksort( int * a , int p , int r) //快排
{
int q;
if(p < r)
{
q = partition( a ,p , r);
quicksort( a ,p , q - 1);
quicksort( a , q + 1 , r);
}
}
int main()
{
int a [ 100 ];
int n;
int i;
while( scanf( "%d" , &n))
{
for( i = 1; i <=n; i ++)
{
scanf( "%d" , & a [ i ]);
}
quicksort( a , 1 ,n);
for( i = 1; i <=n; i ++)
{
printf( "%d " , a [ i ]);
}
}
return 0;
}