我有两种类型:
void sort1(std::vector<int> &toSort)
{
for(VintIter i=toSort.begin(); i!=toSort.end(); i++)
{
for (VintIter j =(toSort.end()-1); j != i; --j)
{
if (*(j - 1) > *(j))
{
std::iter_swap(j - 1, j);
}
}
}
}
void sort2(std::vector<int> &toSort)
{
for(int i= 0; i<(toSort.size()-1); i++)
{
int minElem=i,maxElem=i+1;
if(toSort[minElem]>toSort[maxElem])
{
std::swap(toSort[minElem],toSort[maxElem]);
}
while(minElem>0 && toSort[minElem]<toSort[minElem-1])
{
std::swap(toSort[minElem],toSort[minElem-1]);
minElem--;
}
while(maxElem<(toSort.size()-1) && toSort[maxElem]>toSort[maxElem+1])
{
std::swap(toSort[maxElem],toSort[maxElem+1]);
maxElem++;
}
}
}
我使用QueryPerformanceFrequency和QueryPerformanceCounter来获取这些时间。 对于sort1的1000个元素的随机向量,返回20.3,对于sort2 5.4。这没关系.. 但是当我试图获得排序数组的重新排序时,所以对于toSort向量已经排序的最佳情况,重新设置有点奇怪。 对于sort1它的12.234和sort2的是0.0213 .. 对于10 000个元素,sort1为982.069,sort2为0.2!
我有断言是否对矢量进行了排序。 我在Windows 7和Windows 8上使用了最新的mingw。对于i7-5700 HQ和i5-6300U ..
这是我创造更好的东西,没有实施的唯一练习。我的想法全是,所以我不想使用std :: sort。
我的问题是: 为什么第二种算法会给出我的〜0次10 000个元素?
答案 0 :(得分:0)
在任何情况下,第一个都有n²
的复杂性。
在排序的情况下,您的第二个算法是线性的:
toSort[minElem] < toSort[minElem - 1]
和toSort[maxElem] > toSort[maxElem+1]
始终为false
,因此您的内部循环会立即中断。