我正在嘗試在 C 的書中學習冒泡排序演算法。我似乎無法在下面的代碼中理解如何int outer以及如何int inner鏈接到nums陣列的哪個元素。就像whileinner變成(如果我是正確的),然后如何通過回圈進行?nums[0]outernums[1]
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int ctr, inner, outer, didSwap, temp;
int nums[10];
time_t t;
srand(time(&t));
for (ctr = 0; ctr < 10; ctr )
{
nums[ctr] = (rand() % 99) 1;
}
puts("\n Here is the list before the sort: ");
for (ctr = 0; ctr < 10; ctr )
{
printf("%i\n", nums[ctr]);
}
for (outer = 0; outer < 9; outer )
{
didSwap = 0;
for (inner = outer; inner < 10; inner )
{
if (nums[inner] < nums[outer])
{
temp = nums[inner];
nums[inner] = nums[outer];
nums[outer] = temp;
didSwap = 1;
}
}
if (didSwap == 0)
{
break;
}
}
puts("\n Here is the list after the sort: ");
for ( ctr = 0; ctr < 10; ctr )
{
printf("%i\n", nums[ctr]);
}
return 0;
}
uj5u.com熱心網友回復:
inner永遠不會變成nums[0]. inner和outer是陣列索引,所以什么時候inner是0,nums[inner]是nums[0]。
執行比較和交換的代碼從不使用innerand outer,它使用nums[inner]and nums[outer]。
if (nums[inner] < nums[outer])
{
temp = nums[inner];
nums[inner] = nums[outer];
nums[outer] = temp;
didSwap = 1;
}
uj5u.com熱心網友回復:
我正在嘗試在 C 的書中學習冒泡排序演算法。
對于初學者,如果提供的代碼確實來自一本書,那么我建議停止閱讀這本書,因為這本書的作者似乎是一個低素質的程式員。
提出的方法不是冒泡排序方法。
它看起來像帶有冗余交換的選擇排序方法。而且代碼包含一個嚴重的錯誤。
例如采取一個像這樣的陣列
int nums[] = { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
并且陣列不會被排序!
內回圈在做什么?
它在當前元素之后遍歷陣列nums[outer],如果找到nums[inner]小于nums[outer]它的元素,則交換元素并將標志設定didSwap為 1(標志表示交換了一些元素并且外回圈應繼續其迭代)
if (nums[inner] < nums[outer])
{
temp = nums[inner];
nums[inner] = nums[outer];
nums[outer] = temp;
didSwap = 1;
}
}
否則,如果沒有交換,則控制退出外回圈
if (didSwap == 0)
{
break;
}
但是,即使對于當前nums[outer]沒有找到nums[inner]小于的元素,選擇排序方法也必須繼續其迭代nums[outer]。
這是一個演示程式,顯示所提出的排序方法(不是冒泡排序方法)不起作用。
#include <stdio.h>
int main( void )
{
int ctr, inner, outer, didSwap, temp;
int nums[3] = { 1, 3, 2 };
for (outer = 0; outer < 2; outer )
{
didSwap = 0;
for (inner = outer; inner < 3; inner )
{
if (nums[inner] < nums[outer])
{
temp = nums[inner];
nums[inner] = nums[outer];
nums[outer] = temp;
didSwap = 1;
}
}
if (didSwap == 0)
{
break;
}
}
puts("\n Here is the list after the sort: ");
for ( ctr = 0; ctr < 3; ctr )
{
printf("%i\n", nums[ctr]);
}
}
程式輸出為
Here is the list after the sort:
1
3
2
如您所見,陣列未排序。:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/492019.html
