【问题标题】:Bubble Sort Algorithm in CC中的冒泡排序算法
【发布时间】:2013-07-13 09:45:23
【问题描述】:

我试图完成的程序是一个使用冒泡排序算法的程序。我不确定问题是什么或问题出在哪个函数中。问题是程序没有正确地对数组进行排序。 (也必须按升序排列)。

代码如下:

#include <stdio.h>
#include "simpio.h"

void getArray (int arr[], int size);
void sortArray (int arr[], int size);
void swap (int arr[], int num, int number);
void dispArray (int arr[], int size);
bool checkBigger (int arr[], int num, int number);

main()
{
          int size;

          printf("Enter number of elements: ");
          size=GetInteger();

          int arr[size];
          getArray(arr, size);
          sortArray(arr, size);
          dispArray(arr, size);

          getchar();
}

void getArray (int arr[], int size)
{
          int num;    

          printf("Please enter the value of the elements: \n");
          for(num=0; num<size; num++)
          {
                     arr[num]=GetInteger();           
          }    
}

void sortArray (int arr[], int size)
{
          int num, number, d;

          for(num=0;num<size-1;num++)
          {
              for(d=0; d<size-num-1; d++)
              {
                     number=num+1;                
                     checkBigger(arr, num, number);              
              }
          }
}

void swap (int arr[], int num, int number)
{
          int tem;

          tem=arr[num];
          arr[num]=arr[number];
          arr[number]=tem;
}

void dispArray (int arr[], int size)
{
          int num;

          printf("The sorted list is:\n");
          for(num=0; num<size; num++)
          {
                      printf("%d\t", arr[num]);         
          }     
}

bool checkBigger (int arr[], int num, int number)
{     
          if(arr[num]>arr[number])
          {
                      swap(arr, num, number);                     
          }     
}

非常感谢。

【问题讨论】:

  • 找出问题,然后寻求解释/解决方案。输出是什么?您是否尝试添加一些调试?
  • SO 不适用于代码审查。您有具体的技术问题吗?
  • 要掌握的一项技能是调试代码。测试各个功能是否符合您的预期。 (远的目标:了解单元测试)。查看发生了什么(接近目标:在程序执行期间添加带有重要信息的输出)。花时间掌握调试器的使用,以便能够在执行期间单步执行代码(中期目标)。
  • 我的问题是,为什么当我输入 5 个值 78 34 65 33 21 时,我会得到 34 65 33 21 78 的排序列表。

标签: c arrays function bubble-sort


【解决方案1】:
void sortArray (int arr[], int size)
{
    int num, number, d;

    for(num=0;num<size-1;num++)
    {
        for(d=0; d<size-num-1; d++)
        {
            number=d+1;
            checkBigger(arr, d, number);
        }
    }
}

【讨论】:

  • 非常感谢这个程序现在可以正常工作 =),但我还是不明白为什么我们使用 d?
  • @C_Beginner_Learner checkBigger(arr, num, number); 内循环 numnumber 总是相同的值。
【解决方案2】:

很确定你的问题出在你的算法上,试着用纸笔模拟你的算法。它将帮助您更好地理解您的代码和算法:)

为了您的方便,我在这里包含了我不久前做的冒泡排序算法

void bubbleSort( int a[], int n)
{
    int i,j,temp; // for a={1,2,3,4,5} n is 5

    n = n - 1;    // bcz otherwise it will get out of index

    for(i=0; i<n; i++)
    {
        for(j=0; j<n-i; j++)
        {
            if(a[j]>a[j+1])
            {
                temp = a[j+1];
                a[j+1] = a[j];
               a[j] = temp;
            }

        }

    }

}

希望对你有帮助

【讨论】:

  • 是的,非常感谢,现在我可以看到我必须使用 d 而不是将其标记为 num :)
【解决方案3】:

我从上面的例子中得到的只是交换排序的一个实现。

外部循环上的交换排序检查表中的每个条目与第一个元素,必要时交换。在内循环结束时,最低元素位于位置 1,然后从位置 2 开始,将其与其余元素进行比较,并进行交换。即使数组已经有序,排序也不能停止。它必须进行 n*(n-1) 比较。已排序的 50 个元素的数组将进行 50*49 次比较。

冒泡排序的工作方式不同

将交换标志设置为零。然后 沿着数组滑动,比较位置(i)和位置(i+1)。如果发生交换,则再次进行排序。

这是一些伪代码。

  1. 交换 = 0
  2. 做{
  3. for (i=o;i
  4. if (array[i] > array[i+1])
  5. {
  6. 进行交换
  7. 设置交换=1
  8. }
  9. /**/
  10. } 同时(交换 == 1);

上面说明了冒泡排序。

注意。如果数据有序,则没有交换,也没有第二次循环。排序算法能够提前退出。

如果有 50 个元素的数组是有序的,那么排序会进行 50 次比较并且会停止。 前面描述的交换排序必须进行 50*49 或 2450 次比较。

【讨论】:

  • 我写了一个大约 20 行的冒泡排序示例程序。我想在此处附上它,但不知道该怎么做。
【解决方案4】:
//   BUBBLE SORT.
#include <stdio.h>
#define MAX 20
int main()
{
    int arr[MAX];int no;

    printf("PLEASE ENTER THE CURRENT SIZE OF THE ARRAY\n"); 
    scanf("%d",&no);

    int i;
    printf("PLEASE ENTER THE ELEMENTS OF THE ARRAY\n");
    for(i=0;i<no;i++)
        scanf("%d",&arr[i]);  /*reading the elements*/

    /* sorting begins*/
    int j,k,l;
    int temp;
    int flag=0;

    for(k=0;k<no-1;k++)
        {
        flag=0;
        j=k;
        for(i=0;i<no-j-1;i++)  /* not going to the part that has been sorted*/
        {
            if(arr[i]>arr[i+1])
            {
                flag=1;
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
            else 
                continue;/* not necessary*/
        }
        if(flag==0)  /*implies that the array is alraedy sorted*/
            break;
    }
    printf("THE SORTED LIST:\n\n");
    for(i=0;i<no;i++)
        printf("%d\n",arr[i]);
}

【讨论】:

  • 我是初学者。我刚刚了解到算法做了一些更改,正如评论中提到的那样。
猜你喜欢
  • 2018-08-11
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2013-11-02
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多