计算掉期和比较数:选择排序

时间:2019-05-03 08:22:40

标签: c# sorting count

我正在尝试计算选择排序算法进行的交换和比较的次数。 CountSwaps是全局变量。

我尝试在实际的swap方法中实现swap计数,但是它提供了相同的输出。

 public static void SelectionSort(int[] Array) // descending order
    {
        int countComps = 0;
        int max;
        Stopwatch timer = new Stopwatch();
        timer.Start();
        for (int i = 0; i <= Array.Length - 1; i++) // go through the list
        {
            countComps++;
            max = i; // maximum equals the current position in list
            for (int j = i + 1; j < Array.Length; j++)
            {
                if (Array[j] > Array[max])
                    max = j; // max equals biggest in list j
            }
            countSwaps = 0;
            swap(Array, i, max); 
            countSwaps++;
        }           
        Console.WriteLine("Array after Basic Selection Sort");
        Display(Array);
        timer.Stop();
        Console.WriteLine("Time Taken for Basic Selection Sort is {0} milliseconds", timer.ElapsedMilliseconds);
        Console.WriteLine("The number of swaps is : {0} ", countSwaps);
        Console.WriteLine("The number of comparisons is : {0} ", countComps);

我的交换计数给出的输出值为1,这显然是错误的。 我的比较计数给出的输出值为5128-这是指文本文件中值的数量。我确定比较应该是列表中值的数量。1。

1 个答案:

答案 0 :(得分:0)

您在这里犯了一些错误。一方面,您每次都会重置countSwaps,这就是为什么计数不超过一个的原因:

        …}
        countSwaps = 0; // <--------- here!
        swap(Array, i, max); …

第二,您根本不算比较。您正在计算外循环运行的次数。您应该在每次实际比较发生时增加countComps:

        for (int j = i + 1; j < Array.Length; j++)
        {
            ++countComps; <--------- here!
            if (Array[j] > Array[max])
                max = j; // max equals biggest in list j
        }

选择排序是O(n ^ 2)排序,您可能会获得5000个条目的数百万个比较,这很多,这就是为什么我们通常不对大型集合使用选择排序。 O(n * log n)排序(例如合并排序)将进行类似60k的比较。