C 快速排序不能处理小数字?

C 快速排序不能处理小数字?,c,sorting,quicksort,C,Sorting,Quicksort,我正在使用快速排序对FFT函数中的数据进行排序,这样我就可以使用四分位范围来查找异常值。目前,我不确定为什么经过快速排序的数据没有真正排序。以下是我使用的函数(修改为使用双精度): 排序似乎不正确,因为大多数输出都由非常小的数据(0.00000000)组成,其余部分有如下斑点: 0.00000000 0.00000000 -0.00002053 0.00000000 -0.00002051 -0.00002051 -0.00002050 0.00000000 -0.00002048 0.0000

我正在使用快速排序对FFT函数中的数据进行排序,这样我就可以使用四分位范围来查找异常值。目前,我不确定为什么经过快速排序的数据没有真正排序。以下是我使用的函数(修改为使用双精度):

排序似乎不正确,因为大多数输出都由非常小的数据(0.00000000)组成,其余部分有如下斑点:

0.00000000 0.00000000 -0.00002053 0.00000000 -0.00002051 -0.00002051 -0.00002050 0.00000000 -0.00002048 0.00000000 -0.00002045 -0.00002039 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 -0.00002025 0.00000000 -0.00002020 0.00000000 -0.00002019 0.00000000 0.00000000 -0.00002005 0.00000000
以下是我为获得此输出所做的工作:

 int size = sizes[i];
 int numElements = (int)pow(2.0, ceil(log((double)size)/log(2.0))); //next power of 2
 double *X = (double *) malloc((2*numElements+1) * sizeof(double));
 double *p = ptr[i]; //ptr[i] is a void *ptr;

 //X is filled with data
 for (j = 0; j < size; j++){ //put numbers in
    if ((double)*(p+j) < 1000 && (double)*(p+j) > -1000) {
        X[2*j+1] = (double)*(p+j);
    } else{
        X[2*j+1] = 0.0;
    }
    X[2*j+2] = 0.0;
 }
 for (j = size; j < numElements; j++){ //fill the rest with zeros
     X[2*j+1] = 0.0;
     X[2*j+1] = 0.0;
 }

 printf("\nStarting FFT()..."); fflush(stdout);
 four1(X, numElements, 1, pData);
 for (j = 0; j < numElements; j++){
      //first block of data is printed
      fprintf(pData->pFile, "%.8f %.8f ", X[2*j+1], X[2*j+1]);
  }

 //create a copy of the array for storage
 double *array = (double *) malloc((maxIndex-minIndex+1) * sizeof(double));
 for (j = 0; j < maxIndex-minIndex+1; j++){
    array[j] = X[2*(j+minIndex)+1];
 }

 quickSort(X, 1, 2*(long)size+2); //don't need to sort everything

 //print out the output of the quicksort
 for (j = 1; j < 2*(long)size+2; j++){
     //second block of data is printed
     fprintf(pData->pFile2, "%.8f ", X[j]);
 }

 //use interquartile range
 double q1, q3, iqr;
 q1 = X[(long)size/2+1]; //size is even
 q3 = X[3*(long)size/2+1];
 iqr = q3-q1;
 printf("q1: %.5f, q3: %.5f, iqr: %.5f", q1, q3, iqr);

 //check if any of the elements in array[] are outliers
 for (j = 0; j < maxIndex-minIndex+1; j++) {
      if (array[j] > 3*(q3+iqr)/2){
            printf(" A match!"); fflush(stdout);
            break;
      }
  }
int size=size[i];
整数=(整数)功率(2.0,ceil(对数(双倍)大小)/对数(2.0))//2的次幂
double*X=(double*)malloc((2*numElements+1)*sizeof(double));
双*p=ptr[i]//ptr[i]是一个空*ptr;
//X中充满了数据
对于(j=0;j-1000){
X[2*j+1]=(双)*(p+j);
}否则{
X[2*j+1]=0.0;
}
X[2*j+2]=0.0;
}
对于(j=size;jpFile,%.8f%.8f',X[2*j+1],X[2*j+1]);
}
//创建用于存储的阵列副本
double*数组=(double*)malloc((maxIndex-minIndex+1)*sizeof(double));
对于(j=0;jpFile2,.8f%,X[j]);
}
//使用四分位范围
双q1、q3、iqr;
q1=X[(长)尺寸/2+1]//大小均匀
q3=X[3*(长)尺寸/2+1];
iqr=q3-q1;
printf(“第一季度:%.5f,第三季度:%.5f,iqr:%.5f”,第一季度,第三季度,iqr);
//检查数组[]中是否有任何元素是异常值
对于(j=0;j3*(q3+iqr)/2){
printf(“匹配!”);fflush(stdout);
打破
}
}

为什么排序不能正常工作?

事实上,我在您的程序中找不到确切的问题,但如果您希望程序对元素数组执行快速排序,这就是它:

#include<stdio.h>

void quicksort(int [10],int,int);

int main(){
  int x[20],size,i;

  printf("Enter size of the array: ");
  scanf("%d",&size);

  printf("Enter %d elements: ",size);
  for(i=0;i<size;i++)
    scanf("%d",&x[i]);

  quicksort(x,0,size-1);

  printf("Sorted elements: ");
  for(i=0;i<size;i++)
    printf(" %d",x[i]);

  return 0;
}

void quicksort(int x[10],int first,int last){
    int pivot,j,temp,i;

     if(first<last){
         pivot=first;
         i=first;
         j=last;

         while(i<j){
             while(x[i]<=x[pivot]&&i<last)
                 i++;
             while(x[j]>x[pivot])
                 j--;
             if(i<j){
                 temp=x[i];
                  x[i]=x[j];
                  x[j]=temp;
             }
         }

         temp=x[pivot];
         x[pivot]=x[j];
         x[j]=temp;
         quicksort(x,first,j-1);
         quicksort(x,j+1,last);

    }
}
#包括
无效快速排序(int[10],int,int);
int main(){
int x[20],尺寸,i;
printf(“输入数组的大小:”);
scanf(“%d”,大小(&S);
printf(“输入%d个元素:”,大小);

对于(i=0;ic的索引通常从0变为n-1,这是对快速排序函数进行编码的方式。调用应为:

    quickSort(X, 0, 2*(long)size + 1);  /* changed the +2 to +1 */
我不确定大小代表什么或者为什么要乘以2,通常大小是要排序的元素数,在这种情况下,调用是:

    quickSort(X, 0, size - 1);

你需要直接在问题中发布代码,而不是仅仅通过一个链接。我甚至不知道你发布的数据是什么意思,但是如果你的排序算法输出的数据与输入的数据不同,那么它就坏了。显然,如果我们看不到你的代码,我们无法告诉你什么是坏的。在一些网站上找到的示例代码不算数。我看这是一个名为
qsort
的库函数,以防您错过它。@user3386109:除了它不一定使用快速排序之外。
这是我使用的函数(c/c++).
-如果这是真的,难怪会得到奇怪的结果,因为这是ints的结果。输出几乎相同,但感谢您的回答:3@himty-我看不出X[]的初始化位置。我省略了它,因为它有点复杂。不过我可以添加它。
    quickSort(X, 0, 2*(long)size + 1);  /* changed the +2 to +1 */
    quickSort(X, 0, size - 1);