C - 仅使用未签名整数实现QuickSort

C++ - Implementing quicksort using unsigned integers only?

本文关键字:整数 实现 QuickSort      更新时间:2023-10-16

我有

std::vector<unsigned int> numbers;

多数民众赞成到充满了数字,并且需要在不使用int索引的情况下快速进行快速划分 - 仅允许无符号int作为向量索引。

当我将所有" int"转换为" unsigned int"时,我看到的所有QuickSort示例在某些情况下,由于索引可能为-1(由于J-)。

编辑:这是一个示例

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是未签名的int并变为0,则j-成为一个巨大的数字(0xffffffff),并且(i&lt; = j)始终是正确的。有人知道如何仅使用Unsigned Int索引实现QuickSort吗?

如果您查看包含枢轴描述的页面,则它是错误实现的。这可能会导致枢轴找不到,而j变得少于0。如果正确选择了枢轴作为范围内包含的数字,我认为该算法也可以与无签名的整数一起使用。

这篇文章很旧,但是如果某人仍然有需要,他可以找到可以在此处容忍无符号int索引的实现

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);
    }
}