这是我编写的用于最初输入随机数然后使用插入排序方法对其进行排序的代码。
#include<iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(void)
{
int array[10];
srand (time(0));
for (int i = 0; i < sizeof(array)/sizeof(array[0]); i++ )// inputting values into array[10]
{
array[i] = 1 + (rand()%100); //any random number between 1 - 100
}
cout <<" Before sorting " << " ---" <<endl;
for (int i = 0; i < sizeof(array)/sizeof(array[0]); i++ )// printing the values
{
cout << array[i]<< endl;
}
int key ;
int t;//for future purpose
int compcount = 0;//to keep track of comparisons
for (int j = 1; j<sizeof(array)/sizeof(array[0]);j++)
{
key = array[j];//assign to second element initially
t = j-1;//assign to first element initially
while (j > 0 && array[t]>key)
{
array[t+1] = array[t];//moving array if bigger than next element
t = t-1;
compcount++;
}
array[t+1] = key;
}
cout << " After sorting" << " --- " <<endl;
for (int i = 0; i < sizeof(array)/sizeof(array[0]); i++ )
{
cout << array[i]<< endl;
}
cout << "comparison count is " << compcount << endl;
system ("pause");
return 0;
}
我会说实话,我有一个项目,它要求运行算法以获得最佳,最差和随机输入并计算关键比较的数量(我相信在此代码中是“compcount”)
现在随机输入对此有意义。当我使用“已经排序”的数字数组(最佳情况场景)执行另一个代码时,关键比较的数量为0。 有人能否说明最糟糕的情况是否与此完全相反?如果是这种情况我尝试这样做,但我只进行了32次比较,数组的大小为32。
很抱歉这个问题很长。 最坏情况输入应该有(n ^ 2-n)/ 2个比较对吗? 最好的情况应该是n-1,因为只有第一个元素会遍历整个列表并确认它已经排序。我如何在代码中得到它?
答案 0 :(得分:2)
您正在进行比较作为while条件的一部分,这意味着您只计算成功的比较,这就是为什么您的最佳案例结果是错误的。 compcount ++也应该在while循环之上。
编辑:
compCount++;
while (t >= 0 && array[t] > key)
{
array[t+1] = array[t];//moving array if bigger than next element
t = t-1;
if (t >= 0) // This is a hack to ensure that 't >= 0' will pass
compCount++; // and another comparison will happen
}
答案 1 :(得分:2)
程序中有一个错误
while (j > 0 && array[t]>key)
应该是
while (t >= 0 && array[t]>key)
除此之外,它具有反向排序输入works for me。这确实是最糟糕的情况,结果清楚地表明了这一点。
你的结果是n-1,但这是一个小问题。有关解决方案,请参阅@ Mranz的答案。