我是新手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 ;
}
答案 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想要什么?