【发布时间】:2017-04-17 17:24:51
【问题描述】:
您好,我编写了以下程序来输入一个数字数组并对其进行排序。
但对于 1.3333331 等数字,我仍然得到错误的答案!
什么问题?!
#include <stdio.h>
void quicksort( double array[], long long left, long long right);
long long partition( double array[], long long left, long long right);
int fDig( double x);
int main( void) {
long long quantity = 0LL, counter = 0LL;
int dig = 0;
scanf("%lli", &quantity);
double beard[quantity];
for( counter = 0LL; counter < quantity; counter++) {
scanf("%lf", &beard[counter]);
}
quicksort( beard, 0LL, quantity - 1LL);
for( counter = 0LL; counter < quantity; counter++) {
dig = fDig( beard[counter]);
printf("%.*lf", dig, beard[counter]);
if( counter == quantity - 1LL) {
break;
}
printf(" ");
}
return 0;
}
int fDig( double x) {
int result = 0;
while( x != floor(x)) {
x *= 10;
result++;
}
return result;
}
/* Quick sort recursive function */
void quicksort( double array[], long long left, long long right){
if ( left < right) {
long long middle = partition( array, left, right);
quicksort( array, left, middle - 1LL);
quicksort( array, middle + 1LL, right);
}
}
/* Partition :
Modifies the array :
SMALLER , PIVOT , GREATER
Returns the index for pivot because pivot is placed in the final position
*/
long long partition( double array[], long long left, long long right) {
long long middle;
double x = array[left];
long long l = left;
long long r = right;
while( l < r) {
while( ( array[l] <= x) && ( l < right)) {
l++;
}
while( ( array[r] > x) && ( r >= left)) {
r--;
}
if( l < r) {
double temp = array[l];
array[l] = array[r];
array[r] = temp;
}
}
middle = r;
double temp = array[left];
array[left] = array[middle] ;
array[middle] = temp;
return middle ;
}
鉴于数组元素是最多 8 位小数的浮点数,我正在尝试对数组进行排序! (我使用了正确的算法吗?)
【问题讨论】:
-
有什么问题? (即输入和输出是什么)
-
是错误的排序,还是
fDig和输出格式?尝试硬编码实际输入的最大位数,然后看看会发生什么。 -
1.3333331等数字的错误答案这个需要详细解释一下。
-
使用
long long- 9223372036854775807 似乎有点不寻常?另外,您是否需要/想要编写自己的排序?因为 C 有qsort如果这不是必需的。 -
为了让我们理解问题,您需要向我们提供您的输入、预期输出和实际输出。否则任何答案都只是猜测。
标签: c arrays algorithm sorting quicksort