在进行排序算法时经常用到交换两个数组元素的功能,将这个功能单独写成一个子函数,采用传引用调用的参数传递方式,对数组元素的地址直接进行操作,达到改变其位置的功能。代码如下:
void swap(int*p,int*q)
{
int a;
a=*p;
*p=*q;
*q=a;
}
一:选择排序
将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个。
void slef(int a[])
{ int i,j,k;
for(i=0;i<9;i++)//选择第i位,将其他位依次与他相比较
{
for(j=1+i;j<10;j++)//其他位选择
{
if(a[j]<=a[i])//当其他的位存在比第i位小的数时,
{swap(&a[j],&a[i]);//交换
}
}
printf("第 %d 次排序:", i+1);
for(k = 0; k < 10; k++)
printf("%d ", a[k]);
printf("
");
}
}
运行结果如下:
[root@loc paixu]# ./a.out
4
第 1 次排序:6 95 90 49 80 58 27 9 18 50
第 2 次排序:6 9 95 90 80 58 49 27 18 50
第 3 次排序:6 9 18 95 90 80 58 49 27 50
第 4 次排序:6 9 18 27 95 90 80 58 49 50
第 5 次排序:6 9 18 27 49 95 90 80 58 50
第 6 次排序:6 9 18 27 49 50 95 90 80 58
第 7 次排序:6 9 18 27 49 50 58 95 90 80
第 8 次排序:6 9 18 27 49 50 58 80 95 90
第 9 次排序:6 9 18 27 49 50 58 80 90 95
二:插入排序
像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置。
void ins(int a[])
{
int i,j,k,tmp;
for(j = 1; j < 10; j++)
{
tmp = a[j];
i=j;
while(tmp
运行结果如下:
[root@loc paixu]# ./a.out
5
第 1 次排序:27 95 90 49 80 58 6 9 18 50
第 2 次排序:27 90 95 49 80 58 6 9 18 50
第 3 次排序:27 49 90 95 80 58 6 9 18 50
第 4 次排序:27 49 80 90 95 58 6 9 18 50
第 5 次排序:27 49 58 80 90 95 6 9 18 50
第 6 次排序:6 27 49 58 80 90 95 9 18 50
第 7 次排序:6 9 27 49 58 80 90 95 18 50
第 8 次排序:6 9 18 27 49 58 80 90 95 50
第 9 次排序:6 9 18 27 49 50 58 80 90 95
三:气泡排序法
顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。
void paos(int a[])
{
int i,j,k,f=1;
for(j=0;j<9&&f==1;j++)
{f=0;
for(i=0;i<9-j;i++)
{
if(a[i]>a[i+1])
{
swap(&a[i],&a[i+1]);
f=1; }
}
printf("第 %d 次排序:",j+1);
for(k = 0; k < 10; k++)
printf("%d ", a[k]);
printf("
");
}
}
运行结果如下 :
[root@loc paixu]# ./a.out
6
第 1 次排序:27 90 49 80 58 6 9 18 50 95
第 2 次排序:27 49 80 58 6 9 18 50 90 95
第 3 次排序:27 49 58 6 9 18 50 80 90 95
第 4 次排序:27 49 6 9 18 50 58 80 90 95
第 5 次排序:27 6 9 18 49 50 58 80 90 95
第 6 次排序:6 9 18 27 49 50 58 80 90 95
第 7 次排序:6 9 18 27 49 50 58 80 90 95
冒泡排序时,当某次排序不发生数组元素交换时,则排序位完成,这是即可终止排序以减少程序运行时间,代码中通过设置一个标志符f来判断是否产生交换。
附:主函数
int main()
{ int b=0;
int a[10]={95,27,90,49,80,58,6,9,18,50};
scanf("%d",&b);
if(4==b)
{
slef(a);
}
if(5==b)
{
ins(a);
}
if(6==b)
{
paos(a);
}
else
{
return 0;
}
}