c# - 向快速排序算法添加计数器以显示交换操作的总数

标签 c# sorting quicksort

我正在尝试向我的快速排序算法添加一个计数器,以显示在给定数组上执行的交换总数。但是,我运气不佳,并且生成了一个明显不正确的值 (14)。

正在操作的数组是“arr”,它是 128 个十进制数的集合;

1.960 2.010 2.020 1.940 2.030 2.050 2.000 1.890 1.860 1.960 1.990 2.010 2.010 2.010 1.960 1.940 1.920 1.930 1.980 1.960 1.940 1.900 1.860 1.890 1.860 1.860 1.820 1.810 1.790 1.750 1.780 1.850 1.790 1.790 1.780 1.770 1.760 1.770 1.670 1.610 1.610 1.590 1.540 1.520 1.510 1.540 1.620 1.600 1.560 1.570 1.470 1.420 1.440 1.410 1.450 1.370 1.340 1.320 1.330 1.430 1.440 1.430 1.470 1.480 1.510 1.570 1.630 1.680 1.720 1.710 1.670 1.650 1.620 1.610 1.560 1.580 1.570 1.630 1.640 1.720 1.750 1.750 1.680 1.610 1.620 1.600 1.570 1.510 1.530 1.520 1.550 1.550 1.670 1.650 1.540 1.560 1.710 1.860 1.830 1.670 1.750 1.760 1.780 1.890 2.010 2.010 1.970 1.980 2.040 2.020 2.020 2.020 2.080 2.080 2.080 2.100 2.170 2.160 2.150 2.150 2.120 2.110 2.090 2.130 2.150 2.110 2.100 2.120

这是代码

  int n = arr.Length;
  int step = 0;
  int totalsteps = Quick_Sort(arr, 0, n - 1, step);
  Console.WriteLine("Number of steps = {0}", totalsteps);

 private static int Quick_Sort(decimal[] arr, int left, int right, int step)
    {
        int i, j;
        decimal pivot, temp;
        i = left;
        j = right;
        pivot = arr[(left + right) / 2];
        do
        {
            while ((arr[i] < pivot) && (i < right)) i++;
            while ((pivot < arr[j]) && (j > left)) j--;
            if (i <= j)
            {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
                i++;
                j--;
                step++;
            }
        } while (i <= j);
        if (left < j) Quick_Sort(arr, left, j, step);
        if (i < right) Quick_Sort(arr, i, right, step);
        return step;
    }

已解决:通过引用传递了步骤值,现在按预期工作

最佳答案

有3种可能的解决方案

返回值

private static int Quick_Sort(decimal[] arr, int left, int right)
{
   int step = 0;
   int i, j;
   decimal pivot, temp;
   i = left;
   j = right;
   pivot = arr[(left + right) / 2];
   do
   {
      while ((arr[i] < pivot) && (i < right)) i++;
      while ((pivot < arr[j]) && (j > left)) j--;
      if (i <= j)
      {
         temp = arr[i];
         arr[i] = arr[j];
         arr[j] = temp;
         i++;
         j--;
         step++;
      }
   } while (i <= j);
   if (left < j) step += Quick_Sort(arr, left, j, step);
   if (i < right) step += Quick_Sort(arr, i, right, step);
   return step;
}

引用值

private static void Quick_Sort(decimal[] arr, int left, int right, ref int step)
{
   int i, j;
   decimal pivot, temp;
   i = left;
   j = right;
   pivot = arr[(left + right) / 2];
   do
   {
      while ((arr[i] < pivot) && (i < right)) i++;
      while ((pivot < arr[j]) && (j > left)) j--;
      if (i <= j)
      {
         temp = arr[i];
         arr[i] = arr[j];
         arr[j] = temp;
         i++;
         j--;
         step++;
      }
   } while (i <= j);
   if (left < j)  Quick_Sort(arr, left, j, ref step);
   if (i < right)  Quick_Sort(arr, i, right, ref step);

}

全局变量

private int _step= 0;

private static void Quick_Sort(decimal[] arr, int left, int right)
{
   int i, j;
   decimal pivot, temp;
   i = left;
   j = right;
   pivot = arr[(left + right) / 2];
   do
   {
      while ((arr[i] < pivot) && (i < right)) i++;
      while ((pivot < arr[j]) && (j > left)) j--;
      if (i <= j)
      {
         temp = arr[i];
         arr[i] = arr[j];
         arr[j] = temp;
         i++;
         j--;
         _step++;
      }
   } while (i <= j);
   if (left < j)  Quick_Sort(arr, left, j );
   if (i < right)  Quick_Sort(arr, i, right);
}

原始答案

您没有将递归的结果添加回step

if (left < j) step += Quick_Sort(arr, left, j, step);
if (i < right) step += Quick_Sort(arr, i, right, step);

关于c# - 向快速排序算法添加计数器以显示交换操作的总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49631416/

相关文章:

c# - C# 中泛型的接口(interface)和继承

javascript - ngOnInit 内的引用错误

sorting - 修改少量元素后对向量重新排序

javascript - 在 JavaScript 中使用过滤器进行快速排序

c# - 尝试输出 unicode 拉丁十字字符(十六进制 : 271D) in C#

c# - 找出点击了哪个按钮的方法

java - QuickSort分区算法

java - 我可以在java中将算法作为参数传递吗?

c# - 如何识别MEF中的零件?

javascript - 根据财务年度对象对对象进行排序