c语言 - 为什么当我们更改 for 循环中'i'的条件时,插入排序中的传递次数会发生变化?



为什么在插入排序中,当情况是(n-1(时,如果我们为i=0的循环写,那么我们必须考虑n个情况,但在气泡排序中,我们必须再次考虑(n-1个(情况,那么我们就不会面临任何这样的问题?我不明白这件事,请帮帮我。

#include <stdio.h>
void printArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
printf("%dt", a[i]);
}
}
void insertionSort(int *a, int n)
{
int key, j;
for (int i = 0; i < n; i++) // for number of passes
{
printf("nPass number %d started.", i);
key = a[i];
j = i - 1;
while (j >= 0 && a[j] > key)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
}
int main()
{
int arr[] = {12, 54, 65, 7, 23, 9};
int len = 6;
printf("Array before insertion sorting:n");
printArray(arr, len);
insertionSort(arr, len);
printf("nArray after insertion sorting:n");
printArray(arr, len);
return 0;
}

当我们为i=1的循环写时,需要(n-1(种情况。在for循环中,事例数如何随着"i"的变化而变化。它不应该像(int i=0;i<n;i++(;那样吗;???

#include <stdio.h>
void printArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
printf("%dt", a[i]);
}
}
void insertionSort(int *a, int n)
{
int key, j;
for (int i = 1; i <= n - 1; i++) // for number of passes
{
printf("nPass number %d started.", i);
key = a[i];
j = i - 1;
while (j >= 0 && a[j] > key)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
}
int main()
{
int arr[] = {12, 54, 65, 7, 23, 9};
int len = 6;
printf("Array before insertion sorting:n");
printArray(arr, len);
insertionSort(arr, len);
printf("nArray after insertion sorting:n");
printArray(arr, len);
return 0;
}

感谢您的回答。在插入排序中,我们不将索引0元素与任何元素进行比较,这就是我们必须从I=1开始的原因,而在冒泡排序中,必须比较每个元素,甚至索引0处的元素。

最新更新