编写一个C程序,对n个元素的数组执行冒泡排序。 我编写了以下代码,但条件是如果我们发现列表在任何中间点排序,则停止进程
请告诉我如何解决这个问题?
#include <stdio.h>
#include <conio.h>
void bubble_sort(int[], int);
void main() {
int arr[30], num, i;
printf("\nEnter no of elements :");
scanf("%d", &num);
printf("\nEnter array elements :");
for (i = 0; i < num; i++)
scanf("%d", &arr[i]);
bubble_sort(arr, num);
getch();
}
void bubble_sort(int iarr[], int num) {
int i, j, k, temp;
printf("\nUnsorted Data:");
for (k = 0; k < num; k++) {
printf("%5d", iarr[k]);
}
for (i = 1; i < num; i++) {
for (j = 0; j < num - 1; j++) {
if (iarr[j] > iarr[j + 1]) {
temp = iarr[j];
iarr[j] = iarr[j + 1];
iarr[j + 1] = temp;
}
}
printf("\nAfter pass %d : ", i);
for (k = 0; k < num; k++) {
printf("%5d", iarr[k]);
}
}
}
答案 0 :(得分:4)
诀窍是在迭代内部循环中的列表元素时计算或测试是否存在任何交换,如果不需要交换任何元素,那肯定意味着列表已排序强>
答案 1 :(得分:0)
冒泡排序背后的想法是,在每次迭代时,列表中最大的元素到达最后。 在第一次迭代之后,数组的最大元素到达最后。类似地,在第二次迭代中,数组中的第二个最大元素到达倒数第二个位置,依此类推。
所以你必须在你的j变量循环中做一些改变。 像这样:
for (i = 1; i < num; i++) {
for (j = 0; j < num - i; j++) {
if (iarr[j] > iarr[j + 1]) {
temp = iarr[j];
iarr[j] = iarr[j + 1];
iarr[j + 1] = temp;
}
}
通过这个J循环将只迭代那些未排序的元素。