C 中心枢轴元素不工作的快速排序算法

C 中心枢轴元素不工作的快速排序算法,c,algorithm,C,Algorithm,我是一个C程序员新手,很长时间以来一直在研究这个算法。我非常沮丧,因为我无法得到正确的非递减排序序列 欢迎一切帮助。提前谢谢 这是我的密码: #include <stdio.h> #include <conio.h> int swap(short* a, short fst , short scnd){ short temp = a[fst] ; a[fst] = a[scnd] ; a[scnd] = tem

我是一个C程序员新手,很长时间以来一直在研究这个算法。我非常沮丧,因为我无法得到正确的非递减排序序列

欢迎一切帮助。提前谢谢

这是我的密码:

#include <stdio.h>
#include <conio.h>

int swap(short* a, short fst , short scnd){
    short temp  = a[fst] ;
    a[fst]          = a[scnd] ;
    a[scnd]         = temp ;

    return 0 ;
}

int div(short* a ,short p,short middle ,short r){
    while( p < r ){
        if( p < middle ){       
            if( a[p]      > a[middle] ){
                swap(a ,p ,middle) ; 
            }
            p++ ; 
        }
        if( middle < r ){
            if( a[middle] > a[r] ){
                swap(a ,middle , r) ;      
            }         
            r-- ;
        }
    }

    return 0 ;
}

int fast(short* a , short p , short r){
    if( p < r){
        int middle = (p+r)/2 ;
        div(a, p, middle ,r ) ;
        fast(a, p ,middle-1 ) ;
        fast(a ,middle+1 ,r);
    }
}

int main(){
    short n ,i ;
    scanf("%hd",&n);
    short a[n+1] ;
    for(i=1 ; i<=n ; i++ ){
        scanf("%hd",&a[i]);
    }

    fast(a ,1 ,n ) ;
    i=1;
    while(i<=n){
        printf("%hd " , a[i]);
        i++ ;
    }
    getch() ;
    return 0 ;
}
#包括
#包括
整数交换(短*a、短fst、短scnd){
短温度=a[fst];
a[fst]=a[scnd];
a[scnd]=温度;
返回0;
}
int div(短*a、短p、短中间、短r){
而(pa[middle]){
互换(a、p、中间);
}
p++;
}
if(中间a[r]){
互换(a、中间、r);
}         
r--;
}
}
返回0;
}
int快速(短*a、短p、短r){
if(p对于(i=1;i而言,错误在于div函数本身,它没有遵循快速排序逻辑。
你可以在这里找到工作代码


我建议复制粘贴代码,并从它的编码标准中得到启发,包括注释:)

我将更改您的div函数以返回分区的结果索引函数,您可以在分区点的两侧递归。这会清理逻辑,并使单独测试div函数和查找逻辑中的弱点变得容易(它肯定在div()函数中)

看起来,你的代码假设分区总是发生在中间,这并不总是Quas排序的事实(事实上,这是快速排序的一个微妙点)。 下面是一个配分函数示例:

// please forgive any C-syntax errors not my best language
// low and high indicate a segment of the array to partition
// returns the index between low and high which serves as
// the partition point
int partition(short a[], int low, int high){
  int partition = low;
  int pivot = high;  // sub-optimal when a is already sorted
  for(int i=low; i<high; i++){
    if(a[i] < a[pivot]){
      swap(&a[i], &a[partition]);
      partition++;
    }
  }
  // places the pivot into its final sorted position at partition
  swap(&a[partition], &a[pivot]);
  return partition;
}
一个数据序列:
索引:1234567
数据:1208845
中间:(1+7)/2=4
a[中间]=10

你的函数div想要什么?

你的程序出了什么问题?它崩溃了吗?它产生了错误的输出吗?你能给出一些示例输入吗?它没有产生正确的结果…它没有崩溃…你可以看到div的输出函数在枢轴位置设置了正确的元素,我们在该索引排序后会得到什么…@topc奥德:读了我自己写的代码后,你想再说一遍。你需要试着在纸上模拟。我正在尝试一种快速排序的变体,实际上……在每个div函数调用中,我希望中间的索引中有一个元素,我们在对所有元素进行排序后可以在该索引中得到这个元素。我正在尝试一种快速排序的变体,实际上……我想中间索引中没有我们在对所有元素进行排序后将得到的元素…请帮助…那么您根本没有进行快速排序,乍一看,我认为您无法快速确定中位数索引中属于哪个项目(不进行排序)。同样,快速排序通过递归分区工作,这会产生一个已排序的数组。分区不是完全排序(这使算法的这一步变得快速)…它只会在数组中创建一个点,其中分区点左侧的项较少,右侧的项大于或等于分区点。如果您没有实现经典的快速排序,则应以粗体字母表示。实际上,我正在尝试快速排序的一种变体…我希望中间索引具有在对所有元素进行排序后,我们将在该索引中得到的元素…请帮助…@parallelis…我正在尝试一种快速排序的变体实际上…我希望中间的索引中有我们将在对所有元素进行排序后在该索引中得到的元素…请帮助。。。
sort(short a[], int low, high){
  if(high-low > 0){
    int partition = partition(a, low, high);
    // recurse to left and right of partition
    sort(a, low, partition-1);
    sort(a, partition+1, high);
  }
}