我正在尝试计算选择排序算法进行的交换和比较的次数。 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。
答案 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的比较。