1 先写个int型的选择排序
1.1 排序方向枚举
typedef enum tag_SortMode {
SORT_MODE_UP,
SORT_MODE_DOWN,
} SortMode;
1.2 选择排序函数实现
void SelectSort ( int * arr, uint8_t len, SortMode mode)
{
int key;
uint8_t i, j;
if ( mode == SORT_MODE_UP) {
for ( i = 0 ; i < len - 1 ; i++ ) {
key = i;
for ( j = i+ 1 ; j < len; j++ ) {
if ( arr[ key] > arr[ j] ) {
key = j;
} ;
}
if ( key != i) {
swap ( & arr[ key] , & arr[ i] , sizeof ( int ) ) ;
}
}
} else {
for ( i = 0 ; i < len - 1 ; i++ ) {
key = i;
for ( j = i+ 1 ; j < len; j++ ) {
if ( arr[ key] < arr[ j] ) {
key = j;
} ;
}
swap ( & arr[ key] , & arr[ i] , sizeof ( int ) ) ;
}
}
}
1.3 测试用例
int aInt[ ] = { - 25 , 100 , - 1 , 6 , 4 , 0 , - 1 , 255 , 12 , 0 } ;
void print_aInt ( int * arr, uint8_t len)
{
uint8_t i;
for ( i = 0 ; i < len; i++ ) {
printf ( "|%3d" , arr[ i] ) ;
if ( i% 8 == 7 ) {
printf ( "|\r\n" ) ;
}
}
if ( i% 8 != 0 ) {
printf ( "|\r\n" ) ;
}
}
int main ( int argc, char * * argv)
{
printf ( "int sort test --------\r\n" ) ;
print_aInt ( aInt, sizeof ( aInt) / sizeof ( int ) ) ;
SelectSort ( aInt, sizeof ( aInt) / sizeof ( int ) , SORT_MODE_UP) ;
print_aInt ( aInt, sizeof ( aInt) / sizeof ( int ) ) ;
return 0 ;
}
2 泛型编程实现
2.1 排序方向枚举
typedef enum tag_SortMode {
SORT_MODE_UP,
SORT_MODE_DOWN,
} SortMode;
2.2 泛型版选择排序函数实现
void SelectSort ( void * arr, uint8_t len, uint8_t elemSize,
int ( * cmpFn) ( void * , void * ) ,
SortMode mode)
{
int key;
uint8_t i, j;
void * elem1Addr;
void * elem2Addr;
if ( mode == SORT_MODE_UP) {
for ( i = 0 ; i < len - 1 ; i++ ) {
key = i;
for ( j = i+ 1 ; j < len; j++ ) {
elem1Addr = ( char * ) arr + key * elemSize;
elem2Addr = ( char * ) arr + j * elemSize;
if ( cmpFn ( elem1Addr, elem2Addr) > 0 ) {
key = j;
} ;
}
if ( key != i) {
elem1Addr = ( char * ) arr + key * elemSize;
elem2Addr = ( char * ) arr + i * elemSize;
swap ( elem1Addr, elem2Addr, sizeof ( int ) ) ;
}
}
} else {
for ( i = 0 ; i < len - 1 ; i++ ) {
key = i;
for ( j = i+ 1 ; j < len; j++ ) {
elem1Addr = ( char * ) arr + key * elemSize;
elem2Addr = ( char * ) arr + j * elemSize;
if ( cmpFn ( elem1Addr, elem2Addr) < 0 ) {
key = j;
} ;
}
if ( key != i) {
elem1Addr = ( char * ) arr + key * elemSize;
elem2Addr = ( char * ) arr + i * elemSize;
swap ( elem1Addr, elem2Addr, sizeof ( int ) ) ;
}
}
}
}
2.3 测试用例
int aInt[ ] = { - 25 , 100 , - 1 , 6 , 4 , 0 , - 1 , 255 , 12 , 0 } ;
float aFloat[ ] = { 5.2 , 2.1 , - 9.5 , 1.21 , 1.2 , - 6 , 52.3 , 70 } ;
char * aStr[ ] = {
"abc" ,
"ab" ,
"a" ,
"abcd" ,
"a" ,
"abcdefg" ,
"abcde"
} ;
void print_aInt ( int * arr, uint8_t len)
{
uint8_t i;
for ( i = 0 ; i < len; i++ ) {
printf ( "|%3d" , arr[ i] ) ;
if ( i% 8 == 7 ) {
printf ( "|\r\n" ) ;
}
}
if ( i% 8 != 0 ) {
printf ( "|\r\n" ) ;
}
}
void print_aFloat ( float * arr, uint8_t len)
{
uint8_t i;
for ( i = 0 ; i < len; i++ ) {
printf ( "|%5.2f" , arr[ i] ) ;
if ( i% 8 == 7 ) {
printf ( "|\r\n" ) ;
}
}
if ( i% 8 != 0 ) {
printf ( "|\r\n" ) ;
}
}
void print_aStr ( char * * arr, uint8_t len)
{
uint8_t i;
for ( i = 0 ; i < len; i++ ) {
printf ( "|%s" , arr[ i] ) ;
if ( i% 8 == 7 ) {
printf ( "|\r\n" ) ;
}
}
if ( i% 8 != 0 ) {
printf ( "|\r\n" ) ;
}
}
int main ( int argc, char * * argv)
{
printf ( "int sort test --------\r\n" ) ;
print_aInt ( aInt, sizeof ( aInt) / sizeof ( int ) ) ;
SelectSort ( aInt, sizeof ( aInt) / sizeof ( int ) , sizeof ( int ) , IntCmp, SORT_MODE_DOWN) ;
print_aInt ( aInt, sizeof ( aInt) / sizeof ( int ) ) ;
printf ( "float sort test --------\r\n" ) ;
print_aFloat ( aFloat, sizeof ( aFloat) / sizeof ( float ) ) ;
SelectSort ( aFloat, sizeof ( aFloat) / sizeof ( float ) , sizeof ( float ) , FloatCmp, SORT_MODE_DOWN) ;
print_aFloat ( aFloat, sizeof ( aFloat) / sizeof ( float ) ) ;
printf ( "strings sort test --------\r\n" ) ;
print_aStr ( aStr, sizeof ( aStr) / sizeof ( char * ) ) ;
SelectSort ( aStr, sizeof ( aStr) / sizeof ( char * ) , sizeof ( char * ) , StrCmp, SORT_MODE_UP) ;
print_aStr ( aStr, sizeof ( aStr) / sizeof ( char * ) ) ;
return 0 ;
}