排序算法

1、冒泡法排序(升序)

基本思想:将相邻两个数比较,小的调到前头。
1)有N个数(存放在数组a[N]中),第一趟将每相邻两个数比较,小的调到前头,经过N-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;
2)第二趟对余下的N-1个数(最大的数已“沉底”)按上面的方法比较,经过N-2次两两相邻比较后,得次大的数;
3)依次类推,N个数共进行N-1躺比较,在第j躺中要进行N-j次两两比较。


程序代码如下:
#include<stdio.h>
#include<math.h>

#define N 10

void main()
{
int a[N];
int i, j, t;

printf("input 10 numbers:");
for(i=0; i<N; i++)
scanf("%d", &a[i]);

for(j=0; j<N-1; j++)
for(i=0; i<N-1-j; i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
printf("the sorted numbers:");
for(i=0; i<N; i++)
printf("d%", a[i]);
printf("\n");

}



2、选择法排序(升序) 


基本思想: 
1)对有n个数的序列(存放在数组a[n]中),从中选出最小的数,与第1个数交换位置; 

2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;

3)依次类推,选择了n-1次后,这个数列已按升序排列。 


程序代码如下:

 #include<stdio.h> 

#include<math.h> 

#define N 10  


void main() 

{

int i, j, imin, s, a[N];  

printf("input 10 numbers:");  

for(i=0;i<N;i++)   

scanf("%d",&a[i]);  


for(i=0;i<N-1;i++)  

{   

imin=i;   

for(j=i+1;j<N;j++)    

if(a[imin]>a[j])     

imin=j;    

if(i!=imin)    

{     

s=a[i];     

a[i]=a[imin];     

a[imin]=s; 
    }  

 }  

for(i=0;i<N;i++)   

printf("%4d",a[i]);  

printf("\n"); 

}  


3、合并法排序(升序) 

基本思想:将两个有序数组A、B合并成另一个有序的数组C 
1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组; 
2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完; 
3)将另一个数组剩余元素抄入C数组,合并排序完成。 


程序代码如下: 
#include<stdio.h>  
void main() 
{  
int a[10],b[10],c[20],i,ia,ib,ic;  
printf("please input the first array:");  
for(i=0;i<10;i++)   
scanf("%d",&a[i]);  

printf("please input the second array:");  
for(i=0;i<10;i++)   
scanf("%d",&b[i]);  


ia=0;  
ib=0;  
ic=0;  


while(ia<10&&ib<10)  
{   
if(a[ia]<b[ib])   
{   
c[ic]=a[ia];    
ia++;   
}   
else   
{    
c[ic]=b[ib];    
ib++;   
}   
ic++;  
}  

while(ia<=9)  
{   
c[ic]=a[ia];   
ia++;   
ic++;  
}  

while(ib<=9)  
{   
c[ic]=b[ib];   
ib++;   
ic++; 
}  

for(i=0;i<20;i++)   
printf("%2d",c[i]);  
printf("\n"); 
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值