在这里,我做了一个快速实现,使用(至少尝试)一个可能的小技巧,因为我知道输入是集合{1,2,...,1023}中的数字列表。特别是我没有使用必须在列表中的数据透视表。这是函数的主要部分
int partition2(int length, int arr[], int mask) {
int left = 0;
int right = length;
while (left < right) {
while ((left < right) && (!((arr[left])&mask)) ) {
left++;
}
while ((left < right) && ((arr[right-1])&mask)) {
right--;
}
if (left < right) {
right--;
swap(left, right, arr);
left++;
}
}
left--;
return left;
}
void qSort2(int length, int arr[], int mask) {
int boundary;
if (length <= 1) {
return; /* empty or singleton array: nothing to sort */
}
boundary = partition2(length, arr, mask);
qSort2(boundary, arr,mask/2);
qSort2(length - boundary - 1, &arr[boundary + 1], mask/2);
}
main(){
int length = 200;
int *arr;
arr = generateNumbers(length);
qSort2(length, arr, 512);
int i;d
for(i=0;i<length;i++){
printf("%d ", arr[i]);
}
}
对于冗长的代码感到抱歉。函数generateNumbers只使用给定范围内的数字生成大小长度的向量,并且交换只是交换数组中的两个元素。现在我试图利用所有数字都小于1024的事实。因此,粗略地说,其中一半将在对应于2 ^ 9 = 512的位置中包含1的二进制表示。因此我们可以使用它将列表拆分为两个列表。然后我们检查两个列表对应于2 ^ 8的数字是什么并再次拆分列表。我正在使用变量掩码,如果小于掩码,则运算符n&amp; mask为零,如果掩码大于非掩码则为非零。但出于某种原因,它似乎不起作用。有谁知道为什么?输出列表几乎已经排序,但在某些地方只有一些错误。如果有人能帮助我,这将是伟大的。谢谢!
这是generateNumbers函数:
void *makeDynamicIntArray(int length) {
void *ptr = malloc(length*sizeof(int));
if (ptr == NULL) {
printf("\nMalloc failed: out of memory?\n");
exit(-1);
}
return ptr;
}
int *generateNumbers(int length) {
int i, *arr = makeDynamicIntArray(length);
for (i=0; i<length; i++) {
arr[i] = rand() % 1024;
}
return arr;
}