气泡排序选项。需要添加(print_bubble)过程以打印气泡位移

时间:2019-10-02 15:15:19

标签: c arrays sorting

我已经尝试了好几种方法,但是它只是不能正常工作,我只是从C开始。我还想为完成的交换次数添加一个计数器,但是无法提出要写的位置。任何帮助表示赞赏!

#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; 
} 

2 个答案:

答案 0 :(得分:0)

如果使用{}来定义作用域,则很容易找到计算交换次数的地方。

void bubbleSort(int arr[], int n) 
{ 
   int i, j; 
   for (i = 0; i < n-1; i++)       
   {
       for (j = 0; j < n-i-1; j++)
       {
           if (arr[j] > arr[j+1]) 
           {
              swap(&arr[j], &arr[j+1]); 
              // increase swap count here
           }
       }
   }
}

答案 1 :(得分:0)

骇客方法只是添加全局size_t nswaps并在nswaps++;中递增swap()

将指针传递到计数器

如果无法从bubblesort()更改void的返回类型,一种更正确的方法是添加一个参数,该参数允许将指向计数器的指针传递给bubblesort (... size_t *nswaps),然后在您的if (arr[j] > arr[j+1]) { ...; (*nswaps)++; }中。例如

// A function to implement bubble sort 
void bubbleSort(int arr[], int n, size_t *nswaps) 
{ 
    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]);
            (*nswaps)++;                     /* increment counter */
        }
} 

,然后在main()中将计数器初始化为零,并使用'&'(的地址)运算符将指针传递到计数器,在bubblesort()中将该地址的值递增,然后那么您就可以在main()

中找到更新后的值
// Driver program to test above functions 
int main (void) 
{ 
    int arr[] = {64, 34, 25, 12, 22, 11, 90}; 
    int n = sizeof(arr)/sizeof(arr[0]); 
    size_t nswaps = 0;                            /* add counter */
    bubbleSort(arr, n, &nswaps); 
    printf("Sorted array in (%zu swaps): \n", nswaps); 
    printArray(arr, n); 
    return 0; 
} 

提供有意义的计数返回

您还可以将bubblesort()的返回类型更改为size_t,并简单地返回计数,例如

// A function to implement bubble sort 
size_t bubbleSort(int arr[], int n) 
{ 
    size_t nswaps = 0;
    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]);
            nswaps++; 
        }

    return nswaps;
} 

然后在main()中捕获返回值:

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