【问题标题】:Bubble sort logic, number of iterations冒泡排序逻辑,迭代次数
【发布时间】:2018-10-29 21:25:20
【问题描述】:

我有以下代码:

// C program for implementation of Bubble sort 
#include <stdio.h> 

void swap(int *xp, int *yp) 
{ 
    int temp = *xp; 
    *xp = *yp; 
    *yp = temp; 
} 

// A function to implement bubble sort 
void bubbleSort(int arr[], int n) 
{ 
   int i, j; 
   for (i = 0; i < n-1; i++)       

       // Last i elements are already in place    
       for (j = 0; j < n-i-1; j++)  
           if (arr[j] > arr[j+1]) 
              swap(&arr[j], &arr[j+1]); 
} 

/* Function to print an array */
void printArray(int arr[], int size) 
{ 
    int i; 
    for (i=0; i < size; i++) 
        printf("%d ", arr[i]); 
    printf("n"); 
} 

// Driver program to test above functions 
int main() 
{ 
    int arr[] = {64, 34, 25, 12, 22, 11, 90}; 
    int n = sizeof(arr)/sizeof(arr[0]); 
    bubbleSort(arr, n); 
    printf("Sorted array: \n"); 
    printArray(arr, n); 
    return 0; 
} 

唯一让我感到困惑的部分是第一个 for 循环中的 i &lt; n-1 和 BubbleSort 函数内部 for 循环中的 J&lt; n-i-1。为什么它们都没有设置为i &lt;= n-1J&lt;=n-i-1?例如,第一次迭代总共 n = 7,因此这意味着它应该在外循环中循环 6 次,在内循环中循环 6 次。但是,如果没有 &lt;= 符号,每个循环只会进行 5 次迭代。在网站上,它说明了两个循环都经历了 6 次迭代,但是我不确定如果没有 &lt;=in 会发生这种情况。

来源:https://www.geeksforgeeks.org/bubble-sort/

【问题讨论】:

  • 具有 N 个条目的 C 数组的索引为 0 到 N-1。

标签: c bubble-sort


【解决方案1】:

注意arr[j+1] 的使用。假设您的数组有n = 7。然后当i = 0j = n - i - 1 = 6 时,您将访问arr[j+1] = arr[6 + 1] = arr[7]。但是,arr 开头只有 7 个元素,因此索引 7 超出范围,因为索引从 0 开始,arr[6] 是第七个元素。

至于为什么没关系,数组的最后一个元素在与倒数第二个元素进行比较时已经交换了。或者如果数组只有 1 个元素,则它已经排序。

【讨论】:

  • 作为一般评论,我认为选择排序在各方面都比冒泡排序好,包括易于实现/理解(插入排序更好,但可能有点难以正确)。 en.wikipedia.org/wiki/Selection_sort
  • 谢谢。但是,如果内部循环没有设置为
  • @user3314399 如果n = 7,则从i = 0 迭代,而i &lt; n - 1 迭代值0、1、2、3、4 和5,这是六次,因为0 是第一个.当在 5 时进行比较 arr[5] &gt; arr[6],它涵盖了索引 6 处的第七个元素。
  • 我尝试运行代码并在结果末尾打印一个 n。知道为什么吗? 11 12 22 25 34 64 90 n
  • @user3314399 因为你在结尾打印nprintf("n");
猜你喜欢
  • 1970-01-01
  • 2014-10-29
  • 2012-11-24
  • 1970-01-01
  • 2018-12-16
  • 2020-09-23
  • 2020-11-20
  • 2016-02-27
  • 1970-01-01
相关资源
最近更新 更多