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

C# 向快速排序算法添加计数器以显示交换操作的总数,c#,sorting,quicksort,C#,Sorting,Quicksort,我试图在快速排序算法中添加一个计数器,以显示在给定数组上执行的交换总数。然而,我没有运气,并且正在生成一个明显不正确的值(14) 被操纵的数组是“arr”,它是128个十进制数的集合 1.960 2.010 2.020 1.940 2.030 2.050 2 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

我试图在快速排序算法中添加一个计数器,以显示在给定数组上执行的交换总数。然而,我没有运气,并且正在生成一个明显不正确的值(14)

被操纵的数组是“arr”,它是128个十进制数的集合

1.960 2.010 2.020 1.940 2.030 2.050 2 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;
    }
int n=阵列长度;
int步长=0;
int totalsteps=快速排序(arr,0,n-1,step);
WriteLine(“步骤数={0}”,totalsteps);
私有静态int快速_排序(十进制[]arr,int left,int right,int step)
{
int i,j;
十进制枢轴,温度;
i=左;
j=右;
枢轴=arr[(左+右)/2];
做
{
而((arr[i]left))j--;

如果(i有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);
}

你能举一个你期望的结果的例子吗?这个函数是递归调用的。试着让你的步长参数ref,或者其他调用返回sum,否则你只能从第一个调用得到结果dive@Viliam使step参数ref生效。感谢在现有代码中添加统计类型计数器时,通常最好使用全局变量这减少了需要更改的代码量,并使使用条件编译(#if…)更容易启用/禁用这些类型的计数器。刚刚尝试了此操作,但现在步骤数为-888846434,因此其他一些操作失败。Pete tongIt不起作用,因为计数器步骤不是从零开始的,而是作为已递增的递归传递的。如果该步骤是本地化的,并且从零开始的,那么就可以了。@Viliam,谢谢,这是正确的现在是凌晨1点,而不是在电脑前,但这是有道理的。写下答案
if (left < j) step += Quick_Sort(arr, left, j, step);
if (i < right) step += Quick_Sort(arr, i, right, step);