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

时间:2012-08-29 18:16:34

标签: 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]         = 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 ;
}

3 个答案:

答案 0 :(得分:1)

错误在div函数本身,不遵循QuickSort逻辑。 你可以在Quicksort algorithm

找到工作代码

我建议复制粘贴代码,并从编码标准中获取灵感,包括评论:)

答案 1 :(得分:0)

我会改变你的div函数来返回分区的结果索引。这样在fast()函数中你可以在分区点的两侧递归。这样可以清理逻辑,并且可以很容易地单独测试div函数并找到逻辑中的弱点(它肯定在div()函数中)。

看起来目前你的代码假设分区总是在中间发生,但对于quicksort并不总是这样(事实上这是快速排序的一个细微点)。

这是一个示例分区函数:

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

这可以递归使用,如下所示

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

答案 2 :(得分:0)

一个数据seq:
index:1 2 3 4 5 6 7
数据:1 2 0 10 8 4 5
中:(1 + 7)/ 2 = 4
一个[中间] = 10
你的功能div想要什么?