关于昨天和前天写的 冒泡排序和选择排序的测试
生成10W个随机数据,来进行测试,循环十次,看看我的写法和常见的写法所使用的时间。为了准确性,两个数组所使用的数据是一模一样的,当然我会放出代码,如果你敢兴趣的话,可以自己运行。
常见的写法是 sort1, 我的写法是 sort2。
先给出选择排序的截图( 截图只有6次对比,但是应该已经能看到差别了 ):
程序代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef int ET; void sort2( ET *array, int l, int r );//我的写法 void sort1( ET *array, int l, int r );//常见的写法 int main( void ) { ET a[ 100000 ], b[ 100000 ]; ET t; int ix, i; time_t tm1, tm2; srand( ( unsigned )time( NULL) ); printf("sort1 sort2\n"); for( ix = 0; ix < 10; ++ix ) { for( i = 0; i < 100000; ++i ) { t = rand() % 10000; a[ i ] = t; b[ i ] = t; } tm1 = time( NULL ); sort1( a, 0, 100000 ); tm2 = time( NULL ); printf( "%.2f ", difftime( tm2, tm1 ) ); tm1 = time( NULL ); sort2( b, 0, 100000 ); tm2 = time( NULL ); printf( "%.2f\n", difftime( tm2, tm1 ) ); } return 0; } void sort1( ET *array, int l, int r ) { ET t; int ix, i; int min; for( ix = l; ix < r; ++ix ) { for( i = ix + 1; i < r; ++i ) min = array[ ix ] > array[ i ] ? i : ix ; t = array[ min ]; array[ min ] = array[ ix ]; array[ ix ] = t; } } void sort2( ET *array, int l, int r ) { int minix, maxix; ET min, max; int i; int t; while( l < r ) { for( minix = l, maxix = l, i = l + 1; i < r; ++i ) { minix = array[ minix ] < array[ i ] ? minix : i; maxix = array[ maxix ] > array[ i ] ? maxix : i; } if( minix == r - 1 || maxix == l ) { if( minix == r - 1 ) { t = maxix; max = array[ r - 1 ]; array[ r - 1 ] = array[ maxix ]; array[ maxix ] = max; min = array[ t ]; array[ t ] = array[ l ]; array[ l ] = min; } else { t = minix; min = array[ l ]; array[ l ] = array[ minix ]; array[ minix ] = min; max = array[ t ]; array[ t ] = array[ r - 1 ]; array[ r - 1 ] = max; } } else { min = array[ l ]; array[ l ] = array[ minix ]; array[ minix ] = min; max = array[ r - 1 ]; array[ r - 1 ] = array[ maxix ]; array[ maxix ] = max; } ++l; --r; } }
冒泡排序:
程序代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef int ET; void sort2( ET *array, int l, int r );//我的写法 void sort1( ET *array, int l, int r );//常见的写法 int main( void ) { ET a[ 100000 ], b[ 100000 ]; ET t; int ix, i; time_t tm1, tm2; srand( ( unsigned )time( NULL) ); printf("sort1 sort2\n"); for( ix = 0; ix < 10; ++ix ) { for( i = 0; i < 100000; ++i ) { t = rand() % 10000; a[ i ] = t; b[ i ] = t; } tm1 = time( NULL ); sort1( a, 0, 100000 ); tm2 = time( NULL ); printf( "%.2f ", difftime( tm2, tm1 ) ); tm1 = time( NULL ); sort2( b, 0, 100000 ); tm2 = time( NULL ); printf( "%.2f\n", difftime( tm2, tm1 ) ); } return 0; } void sort1( ET *array, int l, int r ) { int i,j; ET t; for( i = l; i < r; ++i) for( j = i + 1; j < r; ++j ) if( array[ i ] > array[ j ] ) { t = array[ i ]; array[ i ] = array[ j ]; array[ j ] = t; } } void sort2( ET *array, int l, int r ) { int minix, maxix; int R; ET temp; for( ; l < r; ++l, --r ) { for( minix = l + 1, maxix = r - 2, R = r - 1; minix <= R; ++minix, --maxix ) { if( array[ l ] > array[ minix ] ) { temp = array[ l ]; array[ l ] = array[ minix ]; array[ minix ] = temp; } if( array[ R ] < array[ maxix ] ) { temp = array[ R ]; array[ R ] = array[ maxix ]; array[ maxix ] = temp; } } } }