为什么我的快速排序在C工作中没有实现

时间:2014-10-26 23:33:52

标签: c sorting quicksort

在这里,我做了一个快速实现,使用(至少尝试)一个可能的小技巧,因为我知道输入是集合{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;
}

0 个答案:

没有答案