我有
std::vector<unsigned int> numbers;
那些数字填充并需要在不使用任何int变量的情况下快速排序 - 只允许使用unsigned int。
当我将所有“int”转换为“unsigned int”时,我看到的所有quickSort示例都会中断 因为0-1的情况。
编辑:这是一个例子
void quickSort(std::vector<unsigned int> &numbers, unsigned int left, unsigned int right) {
unsigned int i = left, j = right;
unsigned int tmp;
unsigned int pivot = numbers.size()/2;
/* partition */
while (i <= j) {
while (numbers[i] < pivot)
i++;
while (numbers[j] > pivot)
j--;
if (i <= j) {
tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
i++;
j--;
}
};
/* recursion */
if (left < j)
quickSort(numbers, left, j);
if (i < right)
quickSort(numbers, i, right);
}
修改后的版本:http://diogopinho.hubpages.com/hub/easy-quicksort-with-examples
以上示例Segfaults因为j--;成为一个巨大的数字,(i <= j)仍然是真的。不知道如何解决它。
任何人都知道如何使用unsigned int实现quickSort吗?
答案 0 :(得分:0)
如果您查看链接到的页面,其中包含数据透视表的描述,则会错误地实施。这可能导致无法找到枢轴并且j变得小于0.如果正确选择了枢轴作为包含在范围内的数字,我认为该算法也可以使用无符号整数。
答案 1 :(得分:0)
这篇文章很老,但是如果仍然有人需要,他可以找到一个可以容忍未签名的int索引here
的实现。int partition(int *a,int start,int end)
{
int pivot=a[end];
//P-index indicates the pivot value index
int P_index=start;
int i,t; //t is temporary variable
//Here we will check if array value is
//less than pivot
//then we will place it at left side
//by swapping
for(i=start;i<end;i++)
{
if(a[i]<=pivot)
{
t=a[i];
a[i]=a[P_index];
a[P_index]=t;
P_index++;
}
}
//Now exchanging value of
//pivot and P-index
t=a[end];
a[end]=a[P_index];
a[P_index]=t;
//at last returning the pivot value index
return P_index;
}
void Quicksort(int *a,int start,int end)
{
if(start<end)
{
int P_index=partition(a,start,end);
Quicksort(a,start,P_index-1);
Quicksort(a,P_index+1,end);
}
}