Bubble Sort
最初のループはリストの並べ替えに必要なパスの数を示しているため、実装したいことを考えると、最初のループも間違っていると思います。バブルソートの場合Total Number of elements - 1
、n個の要素のリストをソートするために必要なパス数と同じです(n-1)パスが必要です。したがって、i
私が間違っていない限り、私の謙虚な意見では、の値は1から開始する必要があります。さらに、提供されたスニペットは、必要に応じて変数を宣言するという点で、C言語のコーディングスタイルに似ていません。
2番目のループは基本的に比較を減らすためにあります(要素の数-パス-1)。各反復の後、各パスで最大の要素を(論理的にソートされていないリストの)右側に配置するためです。したがって、その要素は正しい位置にあるので、他の要素と比較する必要はありません。
4 3 2 1 Original List
3 2 1 4 Pass 1
-
Now since this above 4 is in it's rightful place
we don't need to compare it with other elements.
Hence we will start from the zeroth element and
compare two adjacent values, till 1 (for Pass 2)
Here comparison will take place between 3 and 2,
and since 3 is greater than 2, hence swapping
between 3 and 2, takes place. Now 3 is comapred
with 1, again since greater value is on left
side, so swapping will occur. Now 3 is not compared
with 4, since both these values are in their
rightful place.
2 1 3 4 Pass 2
-
Now since this above 3 is in it's rightful place
we don't need to compare it with other elements.
Hence we will start from the zeroth element and
compare two adjacent values, till 1 (for Pass 3)
Here only one comparison will occur, between
2 and 1. After swapping 2 will come to it's rightful
position. So no further comparison is needed.
1 2 3 4 Pass 3
Here the list is sorted, so no more comparisons, after Pass 3.
void bubbleSort(int *ptr, int size)
{
int pass = 1, i = 0, temp = 0;
for (pass = 1; pass < size - 1; pass++)
{
for (i = 0; i <= size - pass - 1; i++)
{
if (*(ptr + i) > *(ptr + i + 1))
{
temp = *(ptr + i);
*(ptr + i) = *(ptr + i + 1);
*(ptr + i + 1) = temp;
}
}
printf("Pass : %d\n", pass);
for (temp = 0; temp < size; temp++)
printf("%d\t", *(ptr + temp));
puts("");
}
}