1.基础选择排序核心代码:
int find_max_index ( int * arr, int n) {
int max = arr[ 0 ] ;
int max_index = 0 ;
for ( int i= 1 ; i< n; i++ ) {
if ( max< arr[ i] ) {
max = arr[ i] ;
max_index = i;
}
}
return max_index;
}
void select_sort ( int * arr, int n) {
for ( int i= 0 ; i< n- 1 ; i++ ) {
int index = find_max_index ( arr, n- i) ;
if ( index != n- i- 1 ) {
int t = arr[ index] ;
arr[ index] = arr[ n- i- 1 ] ;
arr[ n- i- 1 ] = t;
}
}
}
1.1测试代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
int * createRandArray ( int n) {
int * arr = malloc ( n* sizeof ( int ) ) ;
srand ( time ( NULL ) ) ;
for ( int i= 0 ; i< n; i++ ) {
arr[ i] = rand ( ) % 100 + 1 ;
}
return arr;
}
void printArray ( int * arr, int n) {
for ( int i= 0 ; i< n; i++ ) {
printf ( "%d " , arr[ i] ) ;
}
printf ( "\n" ) ;
}
bool isOrder ( int * arr, int n) {
for ( int i= 1 ; i< n; i++ ) {
if ( arr[ i] >= arr[ i- 1 ] ) {
continue ;
} else {
return false;
}
}
return true;
}
int find_max_index ( int * arr, int n) {
int max = arr[ 0 ] ;
int max_index = 0 ;
for ( int i= 1 ; i< n; i++ ) {
if ( max< arr[ i] ) {
max = arr[ i] ;
max_index = i;
}
}
return max_index;
}
void select_sort ( int * arr, int n) {
for ( int i= 0 ; i< n- 1 ; i++ ) {
int index = find_max_index ( arr, n- i) ;
if ( index != n- i- 1 ) {
int t = arr[ index] ;
arr[ index] = arr[ n- i- 1 ] ;
arr[ n- i- 1 ] = t;
}
}
}
int main ( ) {
int n;
scanf ( "%d" , & n) ;
int * arr = createRandArray ( n) ;
printArray ( arr, n) ;
printf ( "Original is order?%s\n\n" , isOrder ( arr, n) ? "yes" : "no" ) ;
select_sort ( arr, n) ;
printArray ( arr, n) ;
printf ( "Select is order?%s\n\n" , isOrder ( arr, n) ? "yes" : "no" ) ;
free ( arr) ;
arr= NULL ;
2.类型通用版选择排序核心代码:
int find_max_index ( void * arr, int n, int size, cmp_t cmp) {
unsigned char max[ size] ;
memcpy ( max, arr, size) ;
int max_index = 0 ;
for ( int i= 1 ; i< n; i++ ) {
if ( cmp ( max, arr+ i* size) < 0 ) {
memcpy ( max, arr+ i* size, size) ;
max_index = i;
}
}
return max_index;
}
void ssort ( void * arr, int n, int size, cmp_t cmp) {
for ( int i= 0 ; i< n- 1 ; i++ ) {
int index = find_max_index ( arr, n- i, size, cmp) ;
if ( index!= n- i- 1 ) {
memswp ( arr+ index* size, arr+ ( n- i- 1 ) * size, size) ;
}
}
}
2.1测试代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
int * createRandArray ( int n) {
int * arr = malloc ( n* sizeof ( int ) ) ;
srand ( time ( NULL ) ) ;
for ( int i= 0 ; i< n; i++ ) {
arr[ i] = rand ( ) % 100 + 1 ;
}
return arr;
}
void printArray ( int * arr, int n) {
for ( int i= 0 ; i< n; i++ ) {
printf ( "%d " , arr[ i] ) ;
}
printf ( "\n" ) ;
}
bool isOrder ( int * arr, int n) {
for ( int i= 1 ; i< n; i++ ) {
if ( arr[ i] >= arr[ i- 1 ] ) {
continue ;
} else {
return false;
}
}
return true;
}
void memswp ( void * a, void * b, int size) {
unsigned char t[ size] ;
memcpy ( t, a, size) ;
memcpy ( a, b, size) ;
memcpy ( b, t, size) ;
}
int find_max_index ( void * arr, int n, int size, cmp_t cmp) {
unsigned char max[ size] ;
memcpy ( max, arr, size) ;
int max_index = 0 ;
for ( int i= 1 ; i< n; i++ ) {
if ( cmp ( max, arr+ i* size) < 0 ) {
memcpy ( max, arr+ i* size, size) ;
max_index = i;
}
}
return max_index;
}
void ssort ( void * arr, int n, int size, cmp_t cmp) {
for ( int i= 0 ; i< n- 1 ; i++ ) {
int index = find_max_index ( arr, n- i, size, cmp) ;
if ( index!= n- i- 1 ) {
memswp ( arr+ index* size, arr+ ( n- i- 1 ) * size, size) ;
}
}
}
int cmpint ( const void * a, const void * b) {
return * ( int * ) a - * ( int * ) b;
}
int cmpchar ( const void * a, const void * b) {
return * ( char * ) a - * ( char * ) b;
typedef struct {
char name[ 10 ] ;
int score;
} Test;
int cmpTest ( const void * a, const void * b) {
return ( ( Test* ) a) -> score - ( ( Test* ) b) -> score;
}
int main ( ) {
int n;
scanf ( "%d" , & n) ;
int * arr = createRandArray ( n) ;
printArray ( arr, n) ;
printf ( "Original is order?%s\n\n" , isOrder ( arr, n) ? "yes" : "no" ) ;
ssort ( arr, n, sizeof ( int ) , cmpint) ;
printArray ( arr, n) ;
printf ( "bsort is order?%s\n\n" , isOrder ( arr, n) ? "yes" : "no" ) ;
char s[ ] = "123azHello" ;
ssort ( s, strlen ( s) , sizeof ( char ) , cmpchar) ;
printf ( "%s\n" , s) ;
free ( arr) ;
arr= NULL ;
}