使用c语言来实现冒泡排序算法

目录

详细代码:

for (int i = 0; i < size - 1; i++)  代码详解

for (int j = 0; j < size - i - 1; j++)代码详解

主要相关知识点(了解即可) 


详细代码:

#include 

void bubbleSort(int arr[], int size)
{
    for (int i = 0; i < size - 1; i++)
    {
        for (int j = 0; j < size - i - 1; j++)
        {
            if (arr[j] > arr[j + 1]) 
            {
                // 交换 arr[j] 和 arr[j+1]
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = { 64, 34, 25, 12, 22, 11, 90 };
    int size = sizeof(arr) / sizeof(arr[0]);

    printf("排序前的数组:\n");
    for (int i = 0; i < size; i++)
    {
        printf("%d ", arr[i]);
    }

    bubbleSort(arr, size);

    printf("\n排序后的数组:\n");
    for (int i = 0; i < size; i++) 
    {
        printf("%d ", arr[i]);
    }

    return 0;
}

这段代码中的 bubbleSort 函数使用冒泡排序算法对整数数组进行排序。通过嵌套循环每次比较相邻的两个元素如果顺序错误,则交换它们的位置。外层循环控制多少轮的比较,内层循环用于执行每一轮的比较和交换操作。

main 函数中,声明一个整数数组 arr,并使用 sizeof 运算符获取数组大小。然后,打印排序前的数组,并调用 bubbleSort 函数对数组进行排序。最后,打印排序后的数组。

运行上述代码,输出结果将为:

排序前的数组: 64 34 25 12 22 11 90

排序后的数组: 11 12 22 25 34 64 90

for (int i = 0; i < size - 1; i++)  代码详解

当我们使用冒泡排序算法时,外层循环 for (int i = 0; i < size - 1; i++) 控制了比较的轮数。这是因为在每一轮中,至少有一个元素会被放置到它最终应该处于的位置上

让我们详细解释一下为什么外层循环条件是 i < size - 1

  • i 是外层循环的计数器,初始值为 0
  • size 是数组的大小,也就是待排序数组中元素的数量
  • size - 1 表示数组的最后一个元素的索引。由于每一轮比较都涉及到相邻的两个元素,所以最后一个元素没有必要再进行比较
  • 因此,i 的取值范围是从 0 到 size - 2(即 size - 1 的前一个索引),共计 size - 1 个值。
  • 当 i 取到 size - 2 时,也就是最后一轮比较时只剩下数组中的最后两个元素需要比较,而不需要再执行下一轮的比较操作

因此,外层循环 for (int i = 0; i < size - 1; i++) 确保进行了足够的比较轮数,以使整个数组按照正确的顺序排序。 

for (int j = 0; j < size - i - 1; j++)代码详解

当我们使用冒泡排序算法时,内层循环 for (int j = 0; j < size - i - 1; j++) 控制了每一轮比较操作中相邻元素的比较和交换

让我们详细解释一下为什么内层循环条件是 j < size - i - 1

  • j 是内层循环的计数器,它表示当前轮数下需要进行比较的元素的索引。
  • size 是数组的大小,也就是待排序数组中元素的数量。
  • i 是外层循环的计数器,表示已经排好序的元素个数,也代表已经经过了 i 轮的比较和交换操作。
  • size - i - 1 表示当前轮数下需要进行比较的元素的最大索引。由于每一轮比较都会将当前最大(或最小)的元素移动到合适的位置上,所以在当前轮数下,已经排好序的部分不需要再参与比较
  • 因此,j 的取值范围是从 0 到 size - i - 2(即 size - i - 1 的前一个索引),共计 size - i - 1 个值。
  • 当 i 增加时,排好序的部分会逐渐增加,而每一轮比较的元素个数会减少。
  • 最后一轮比较时,已经排好序的部分包含了所有的元素,所以内层循环不再执行。

因此,内层循环 for (int j = 0; j < size - i - 1; j++) 确保了每一轮比较操作中需要比较的元素数量逐渐减少,直到最后一轮只剩下最后一个元素不需要再进行比较。这样就实现了冒泡排序算法中的核心逻辑,将较大(或较小)的元素逐步向数组的末尾移动,使得整个数组按照正确的顺序排序。

主要相关知识点(了解即可) 

这段代码主要涉及了以下知识点:

  1. 冒泡排序算法:冒泡排序是一种简单的排序算法,它通过多次比较和交换相邻元素的方式将待排序的元素逐步移动到正确的位置上。它的核心思想是从数组的起始位置开始,比较相邻的两个元素,如果它们的顺序不正确,则交换它们的位置,直到整个数组排序完成。

  2. 循环结构:代码中使用了嵌套的 for 循环来实现冒泡排序算法。外层循环控制了比较的轮数,内层循环控制了每一轮比较操作中相邻元素的比较和交换。

  3. 数组索引和大小:代码中使用了数组的索引来访问和操作数组中的元素。同时,通过 size 变量表示数组的大小,也就是待排序数组中元素的数量。

  4. 循环计数器:代码中的循环结构使用了计数器变量 ij 来控制循环的执行次数和条件。这些计数器变量在每一轮循环中会进行相应的增加或减少操作,以便实现正确的循环逻辑。

  5. 条件判断:代码中使用了条件判断语句来确定循环的终止条件。这些条件判断语句通过比较计数器变量和数组的大小来决定是否继续执行循环。

通过理解和掌握这些知识点,可以更好地理解和实现冒泡排序算法,以及类似的排序算法和循环结构的代码逻辑。

你可能感兴趣的:(算法,c语言,排序算法)