#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void bsort(int n,int a[])
{
int i,j,k;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
if(a[j]>a[j+1]);
{
k=a[j+1];
a[j+1]=a[j];
a[j]=k;
}
}
} }
int main()
{
int i,j,k,m,n;
srand(time(0));
printf("Unesi broj clanova niza:");
scanf("%d",&n);
int a[n];
printf("Niz za sortiranje je:\n");
for(int i=0;i<n;i++) //Generisanje niza
{
a[i]=rand()%(81);
}
for(int i=0;i<n;i++)
{
printf("%3d",a[i]);
}
bsort(n,a);
printf("\n\nSortirani niz je:\n");
for(i=0;i<n;i++)
{
printf("%3d",a[i]);
}
}
答案 0 :(得分:6)
冒泡排序实施存在一些问题。
首先,这一行:
if (a[j] > a[j + 1]); {
不正确。分号终止条件。因此,以下块在内循环的每次迭代中执行,最终无条件地为a[j]
的每个值交换a[j+1]
和j
。这意味着您正在对阵列执行无意义的重新排列。
其次,你没有正确处理内循环中的边缘情况。在j == 19
时,您访问a[j+1]
,即a[20]
,这超出了数组的末尾。因此,您将垃圾数据导入阵列。
最后,即使在纠正了上述内容之后,您的实现也是不必要的低效率,因为您的内部循环在外部循环的每次迭代中都会遍历整个数组,而它不需要。提示:尝试考虑内循环的初始化或终止条件如何依赖于i
。
更新(OP重写后):您只解决了第二个问题。
答案 1 :(得分:1)
int main() {
int a[20];
srand(time(0));
// array values initialization
for (int i = 0; i < 19; i++) {
a[i] = rand() % (81);
}
// array sorting
bsort(a);
// array printing
for (int i = 0; i < 19; i++) {
printf("%3d", a[i]);
}
}