当前位置:编程学习 > C/C++ >>

急求:用C语言程序对一组大小不定的数字排序

题目是:有一组大小不定的数字,需要设定程序对他们进行从小到大的排列。

追问:写个SORT的程序看看
答案:第一个就是冒泡排序法,几乎是最简单的排序方法:

#include <stdio.h>
#include <conio.h>
#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 <stdio.h>
#include <conio.h>
#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 <stdio.h>
#include <conio.h>
#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 <stdio.h>
#include <conio.h>
#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 ;
}

c++直接用sort函数就行了

冒泡排序 中 for( j = 0; j < N-i-1; j++ )

应为for(j=0;j<N-1;j++)

我试过了

上一个:让我看下你的C语言 队、堆和栈的结构体
下一个:如何在最短的时间内,简单学会C语言?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,