【发布时间】:2014-04-08 13:21:15
【问题描述】:
我必须为按 25%、50%、75%、95%、99% 和 99.7% 排序以及随机填充的数组编写和测试快速排序。当我使用大小为 500k 的数组时,我的程序通过随机数组和 25% 的排序数组没有任何问题(但 25% 的排序数组需要 158 秒),但对于 50% 的排序数组,它会引发分段错误和“进程返回 139(0x8b)。 " 对于较小的数组,例如 100k,即使已排序,一切正常。 我如何生成我的数组(我知道不需要参数“zakres”):
void generujTablice(int zakres,float sorted, int size_of_array)
{
Tablica = new int[size_of_array]; //allocating space for array
if(sorted == -1) //when array have to be sorted, but inverted
for(int i=0;i<size_of_array;i++)
Tablica[i] = size_of_array-i;
else
{
for(int i=0;i<sorted * size_of_array;i++) //example: if sorted is 0.25 array have to be sorted in 25% from beginning
Tablica[i] = i;
for(int i=sorted * size_of_array;i<size_of_array;i++) //rest of array is filled randomly but values have to be bigger than these in sorted part of array
Tablica[i] = rand()%int(size_of_array)+sorted * size_of_array;
}
}
还有我的快速排序: (注意:我选择第一个元素作为枢轴,因为我想检查算法的最坏情况。我已经评论了将第一个元素与另一个元素随机混合的行,当我使用这个交换时,一切正常并且非常非常快. lewy == left, prawy == right)
#include <algorithm>
void quicksort(int * Tablica, int lewy, int prawy)
{
if(lewy<prawy)
{
//swap( Tablica[lewy], Tablica[rand()%(prawy-lewy)+lewy]);
int x = Tablica[lewy];
int i = lewy, j = prawy;
do{
while(Tablica[i] < x ) i++;
while(Tablica[j] > x ) j--;
if( i<=j ) swap( Tablica[i++], Tablica[j--] );
}while(i<=j);
quicksort(Tablica,lewy,j);
quicksort(Tablica,i,prawy);
}
}
我正在使用 ubuntu。我试图用谷歌搜索出了什么问题,但在我看来,我的算法与我发现的一些算法几乎相同,所以我不知道如何修复它。 对不起,我的英语很抱歉,我不经常使用它。
感谢您帮助我。
【问题讨论】:
-
尝试对 Tablica 使用 std::vector,而不是动态分配的数组。
-
你怎么打电话给
quicksort? -
}while(i<=j);- 我认为这需要<,而不是<=。 -
我这样称呼它:quicksort(Tablica,0,size_of_array-1);
标签: c++ algorithm segmentation-fault quicksort