【问题标题】:Array Sorting Issues in C++C++ 中的数组排序问题
【发布时间】:2021-11-23 21:13:47
【问题描述】:

我正在尝试制作一个不使用 sort 函数对数组进行排序的程序(不适用于对象或结构)。我已经完成了大于一的工作,但是小于一不断将数组中的最大元素更改为一并对其进行错误排序,并且当与大于函数一起使用时,第一个元素变成了一个大数。有人可以帮我解决这个问题还是我的编译器。

void min_sort(int array[], const unsigned int size){
    for(int k = 0; k < size; k++) {
        for(int i = 0; i < size; i++) {
            if(array[i] > array[i+1]){
                int temp = array[i];
                array[i] = array[i+1];
                array[i+1] = temp;
            }
         }
     }
}

【问题讨论】:

  • i==size-1(您的循环最后一次运行)时,i+1 超出范围...

标签: c++ arrays sorting


【解决方案1】:

您没有正确循环。看起来您正在尝试bubble sort,即:

void min_sort(int array[], const unsigned int size){
    for(int k = 0; k < size; k++)
        for(int i = k+1; i < size; i++)
            if(array[i] < array[k]){
                int temp = array[i];
                array[i] = array[k];
                array[k] = temp;
            }
}

【讨论】:

  • 这不是冒泡排序......这更接近于选择排序,但做了很多不需要的交换。
  • 也许,我不能说,因为它看起来像两者,但更接近冒泡排序。
  • OP 是冒泡排序,你的是奇怪的选择排序。
【解决方案2】:

您对冒泡排序的尝试基本上是正确的,只是您的内部循环存在越界问题。在内部循环的最后一次运行期间,i == size - 1,因此i + 1 等于size,因此data[i+1] 超出范围。只需将for 的条件更改为i &lt; size - 1

工作示例:https://godbolt.org/z/e5ohWPfTz

【讨论】:

    【解决方案3】:
    void min_sort(int array[], const unsigned int size)
    {
      for(int i=0;i<size-1;i++)
      {
        for(int j=0;j<size-1-i;j++)
        {
          if(array[j]>array[j+1])
          {
            swap(array[j] , array[j+1]);
          }
        }
      }
    }
    

    我看到您正在尝试实现bubble sort 算法。我在这里发布了冒泡排序的代码。在冒泡排序中,您基本上比较了index j 处的元素和它旁边的索引j+1 处的元素。如果 array[j] 大于 array[j+1] ,则使用 swap() 函数或使用 temp 方法交换它们。外循环将运行 size - 1 次,内循环将运行 size - 1 - i 次,因为最后一个元素已经到位。

    例如,我们有一个大小为 4 的数组,其中包含以下元素:

    array[i] = [100,90,8,10]

    冒泡排序将按以下步骤对其进行排序:

    90,100,8,10 90,8,100,10 90,8,10,100

    8,90,10,100 8,10,90,100

    8,10,90,100

    看,size-1-i 的使用。您可以看到嵌套循环在外循环的每次迭代中运行的次数较少。

    【讨论】:

      【解决方案4】:

      您的第二个循环条件应该只有一个错误:i &lt; size -1

      应该是这样的:

      for (int i = 0; i < size -1; i++)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-22
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 2018-12-28
        相关资源
        最近更新 更多