基本思想:将相邻两个数比较,小的调到前头。
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");
}
2548

被折叠的 条评论
为什么被折叠?



