诀窍: 拆东墙补西墙,东拆西补
1.试着写一下一趟排序,比a[0]小的都在a[0]的左边比a[0]大的都在a[0]右边
#include <stdio.h>
void swap ( int * a, int * b) {
int temp= * a;
* a= * b;
* b= temp;
}
void quickSort ( int * a, int length) {
int low= 0 ;
int high= length- 1 ;
int flag= a[ 0 ] ;
while ( low< high) {
while ( high> low&& a[ high] >= flag) {
high-- ;
}
if ( low< high) {
a[ low] = a[ high] ;
}
while ( low< length&& a[ low] <= flag) {
low++ ;
}
if ( low< high) {
a[ high] = a[ low] ;
}
}
printf ( "low: %d,high:%d\n " , low, high) ;
a[ high] = flag;
for ( int i= 0 ; i< 9 ; i++ ) {
printf ( "%d," , a[ i] ) ;
}
}
int main ( int argc, char const * argv[ ] )
{
int a[ ] = { 2 , 1 , 3 , 5 , 4 , 7 , 9 , 8 , 6 } ;
quickSort ( a, sizeof ( a) / sizeof ( a[ 0 ] ) ) ;
getchar ( ) ;
}
2.效果:比2小的全在2的左边,比2大的全在2的右边
3.完整代码
#include <stdio.h>
void quicksort ( int R[ ] , int low, int high) {
int temp;
int i= low;
int j= high;
if ( low< high) {
temp= R[ low] ;
while ( i< j) {
while ( j> i&& R[ j] >= temp) -- j;
if ( i< j) {
R[ i] = R[ j] ;
++ i;
}
while ( i< j&& R[ i] < temp) ++ i;
if ( i< j) {
R[ j] = R[ i] ;
-- j;
}
}
R[ i] = temp;
quicksort ( R, low, i- 1 ) ;
quicksort ( R, i+ 1 , high) ;
}
}
int main ( int argc, char const * argv[ ] )
{
int a[ ] = { 2 , 1 , 3 , 5 , 4 , 7 , 9 , 8 , 6 } ;
quicksort ( a, 0 , sizeof ( a) / sizeof ( a[ 0 ] ) - 1 ) ;
for ( int i= 0 ; i< sizeof ( a) / sizeof ( a[ 0 ] ) ; i++ ) {
printf ( "%d," , a[ i] ) ;
}
getchar ( ) ;
}
4.效果
5.反思: 如果数组中右边的数比基数小时,要把右边的数赋值到基数原来的位置,即左边, 此时 左边的指针low 要++