数组应用--常用排序(课时2)

本文深入介绍了排序算法中的选择法、冒泡法及合并法,详细阐述了每种算法的基本思想、程序代码,并通过实例演示了如何实现排序功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.选择法排序(升序)

  基本思想: 
1
)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置; 
2
)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置; 
3
)依次类推,选择了n-1次后,这个数列已按升序排列。

程序代码如下: 
void main() 

{ int i,j,imin,s,a[10]; 
printf("/n input 10 numbers:/n"); 
for(i=0;i<10;i++) 
scanf("%d",&a[i]); 
for(i=0;i<9;i++) 
{ imin=i; 
for(j=i+1;j<10;j++) 
if(a[imin]>a[j]) imin=j; 
if(i!=imin) 
{s=a[i]; a[i]=a[imin]; a[imin]=s; } 
printf("%d/n",a[i]); 

}

2.冒泡法排序(升序)

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

{ int a[10]; 
int i,j,t; 
printf("input 10 numbers/n"); 
for(i=0;i<10;i++) 
scanf("%d",&a[i]); 
printf("/n"); 
for(j=0;j<=8;j++) 
for(i=0;i<9-j;i++) 
if(a[i]>a[i+1]) 
{t=a[i];a[i]=a[i+1];a[i+1]=t;} 
printf("the sorted numbers:/n"); 
for(i=0;i<10;i++) 
printf("%d/n",a[i]); 
}

3.合并法排序(将两个有序数组AB合并成另一个有序的数组C,升序)

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

{ int a[10],b[10],c[20],i,ia,ib,ic; 
printf("please input the first array:/n"); 
for(i=0;i<10;i++) 
scanf("%d",&a[i]); 
for(i=0;i<10;i++) 
scanf("%d",&b[i]); 
printf("/n"); 
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]; 
b++;ic++; 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值