用”起泡法“对输入的10数字符按由小到大顺序排列
起泡法:即每一次将相邻两个数进行比较,若符合条件则交换两个数的值。每进行一趟排序,最大的一个数变成最后一个数。以此类推,直至整个数组按照由小到大排列。
举例:现有数组(8 4 3 7 5 6 2 1)
第一趟:4 3 7 5 6 2 1 8
第二趟:3 4 5 6 2 1 7 8
第三趟:3 4 5 2 1 6 7 8
第四趟:3 4 2 1 5 6 7 8
第五趟:3 2 1 4 5 6 7 8
第六趟:2 1 3 4 5 6 7 8
第七趟:1 2 3 4 5 6 7 8
程序分析:由于每一次进行排序后均会产生一个数不用进行比较,因此设置变量k控制不用进行排序的数的个数。由于不确定每一次排序的比较次数,故采用while循环,在循环体中将前一个数与后一个数进行比较。在主函数中输入和输出10个数字。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{
void z(int a[10]);
int a[10];
printf("请输入10个数字:");
int i;
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
z(a);
printf("10个数字从大到小排序为:");
for (i = 0; i < 10; i++)
{
printf("%d ",a[i]);
}
printf("\n");
system("pause");
return 0;
}
void z(int a[10])
{
int i, t, j;
i = 0; j = 1;
int k;
for (k = 0; k <= 9; k++)
{
while (j < 10 - k)//每一趟比较结束后最大的数排到最后,第二次这个数不用进行比较
{
if (a[i] > a[j])//条件符合,交换二者的值
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
i++;//无论是否符合条件,j、j均自增1
j++;
}
i = 0; j = 1;//重置i,j的值
}
}
调试结果:
呜呜,这个程序真的弄了我好长时间(主要是因为我太菜了)。刚开始的时候只能写出进行第一趟排序的代码,然后想了很久都不知道怎样循环进行每一趟的比较。最后没有办法去网上搜了其他人的代码来看,但是虽然他们的代码调试出来是正确的,却不是我的思路我理解不了一些代码的含义,最后突然恍然大悟,可以设置一个变量k来控制不用进行排序的数的个数(即循环趟数),一下子问题就解决了。终于终于完成啦这个题目!哦耶!