作业帮 > 综合 > 作业

用C语言程序对一组大小不定的数字排序拜托了各位

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/16 06:12:11
用C语言程序对一组大小不定的数字排序拜托了各位
有一组大小不定的数字,需要设定程序对他们进行从小到大的排列.
第一个就是冒泡排序法,几乎是最简单的排序方法: #include #include #define N 10 int main( void ) { int i, j, temp ; int a[N] = {0,1,2,3,4,5,6,7,8,9}; // 冒泡排序法进行排序 for( i = 0; i < N - 1; i++ ){ for( j = 0; j < N-i-1; j++ ){ if( a[i] < a[j] ){ temp = a[i] ; a[i] = a[j] ; a[j] = temp ; } } }//第一个for printf("你是入的十个数是:\n") ; for( i = 0; i < N; i++ ){ printf("%d ",a[i] ) ; } getch() ; return 0 ; } 下面的是选择排序法,比冒泡排序法的效率高: #include #include #define N 10 int main( void ) { int i, j, k, temp ; int a[N] = {0,1,2,3,4,5,6,7,8,9}; // 选择排序法进行排序 for( i = 0; i < N - 1; i++ ){ k = i ; for( j = i + 1; j < N; j++ ){ if( a[k] < a[j] ){ k = j ; } temp = a[i] ; a[i] = a[k] ; a[k] = temp ; } }//第一个for printf("你是入的十个数是:\n") ; for( i = 0; i < N; i++ ){ printf("%d ",a[i] ) ; } getch() ; return 0 ; } 下面的是插入排序法,比冒泡排序法和选择排序法的效率都要高: #include #include #define N 10 int main( void ) { int i, j, key, temp ; int a[N] = {0,1,2,3,4,5,6,7,8,9}; // 插入排序法进行排序 for( i = 1; i < N ; i++ ){ key = a[i] ; for( j = i - 1; j >= 0; j-- ){ if( a[j] < key ){ a[j+1] = a[j] ; } } a[j+1] = key ; }//第一个for printf("你是入的十个数是:\n") ; for( i = 0; i < N; i++ ){ printf("%d ",a[i] ) ; } getch() ; return 0 ; } 下面的是归并排序法,我是在看了《算法导论》之后才写的,我自己写不出来.代码写出来很简单,比其它一些书上的简单多了.归并排序法的效率是这四个排序法中效率最高的: #include #include #define N 10 void merge_sort( int *a, int p, int q, int r ) { int i, j, k, m, n ; int array1[N], array2[N] ; // m和n分别是新建立的两个数组中 // 元素的个数 m = q - p + 1 ; n = r - q ; // 先把数组a[N],中的元素放进 // 新建立的两个数组中 for( i = 0; i < m; i++ ){ array1[i] = *( a + p + i ) ; } for( j = 0; j < n; j++ ){ array2[j] = *( a + q + j +1 ) ; } i = j = 0 ; k = p ; // k 不能被初始化为 0 // 开始归并 while( i < m && j < n ){ if( array1[i] > array2[j] ){ *( a + k ) = array1[i] ; ++ k ; ++ i ; } else{ *( a + k ) = array2[j] ; ++ k ; ++ j ; } } // 归并每个数组剩下的元素 while( i < m ){ *( a + k ) = array1[i] ; ++ k ; ++ i ; } while( j < n ){ *( a + k ) = array2[j] ; ++ k ; ++ j ; } } void merge( int *a, int p, int r ) { int q ; // p >= r的情况就是要排序的元素只有一个, // 也就是说,它已经被排好了 if( p < r ){ q = (p + r)/2 ; merge( a, p, q ) ; merge( a, q + 1, r ); merge_sort( a, p, q, r ); } }// merge int main( void ) { int i, j, key, temp ; int a[N] = {0,1,2,3,4,5,6,7,8,9}; merge( a, 0, 9) ; printf("你是入的十个数是:\n") ; for( i = 0; i < 10; i++ ){ printf("%d ",a[i] ) ; } getch() ; return 0 ; }