使用BubbleSort对数组进行排序

Sorting array with BubbleSort

本文关键字:排序 数组 BubbleSort 使用      更新时间:2023-10-16

我更改了代码,但仍然不明白为什么它不会对数组进行排序。。。冒泡排序只将程序中的所有元素向右移动一个位置,而不是对数组进行排序。。。l厌倦了bsort和ssort,它们都为1位做同样的事情

#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("nnSortirani niz je:n");     
for(i=0;i<n;i++)
{
printf("%3d",a[i]);
}

}

您的冒泡排序实现存在几个问题。

首先,这一行:

if (a[j] > a[j + 1]); {

不正确。分号终止条件。因此,下面的块在内部循环的每一次迭代中都会执行,您最终会无条件地将a[j]a[j+1]交换为j的每一个值。这意味着你正在对数组进行一次毫无意义的重新排列。

其次,您没有正确处理内部循环中的边缘情况。当j == 19时,访问a[j+1],即a[20],它位于数组的末尾之外。这样就可以将垃圾数据导入到数组中。

最后,即使在纠正了上面的错误之后,您的实现也是不必要的低效,因为您的内部循环在外部循环的每次迭代中都会遍历整个数组,而这不是必须的。提示:试着想想内部循环的初始化或终止条件如何取决于i

更新(在OP重写之后):您只解决了第二个问题。

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]);
}
}