我编写了一个程序,用于对从最大到最小的50个整数的随机生成数组进行排序。到目前为止它可以工作,但偶尔会在排序数组的末尾返回随机零。未排序的数组中不存在这些零,并且它们并不总是出现。这是我的计划:
#import <Foundation/Foundation.h>
@interface Number: NSObject
- (void) start;
- (int) getValue;
- (void) counted;
- (void) placeValue: (int) a;
@end
@implementation Number
{
int x;
}
- (void) start
{
x = arc4random_uniform(1000);
if (x == 1)
{
x = x+1;
}
}
- (int) getValue
{
return x;
}
- (void) counted
{
x = 0;
}
- (void) placeValue: (int) a
{
x = a;
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool
{
NSMutableArray *unsortedArray = [[NSMutableArray alloc] initWithCapacity: 50];
for (int n = 0; n < 50; n++)
{
Number *num = [[Number alloc] init];
[num start];
[unsortedArray addObject: num];
}
for (int n = 0; n < 50; n++)
{
printf("%i, ", [unsortedArray[n] getValue]);
}
printf ("unsorted array.\n\n");
int x = 0;
int y = 1001;
for (int n = 0; n < 50; n++)
{
for (int m = 0; m < 50; m++)
{
if (([unsortedArray[m] getValue] > x) && ([unsortedArray[m] getValue] < y))
{
x = [unsortedArray[m] getValue];
}
}
printf("%i, ", x);
y = x;
x = 0;
}
printf("sorted array.\n");
} return 0;
}
答案 0 :(得分:0)
- (void) start
{
x = arc4random_uniform(1000);
if (x == 0)
x = x + 1;
}
答案 1 :(得分:0)
每个人都关注arc4random_uniform
可以将零作为可接受的值(这是真的)生成的事实,但还有另一个问题:您的排序算法不正确,因为它只有在数组是唯一的。但是,如果您有任何重复值(并且无法保证arc4random_uniform
不会生成某些重复项),您的算法将只显示其中一个值,因此,当您到达结束时,会看到一堆额外的零。
有很多不同的sorting algorithms,但是可能更容易利用其中一种本地NSMutableArray
排序方法,这可以让你摆脱编写自己的杂草。
答案 2 :(得分:0)
试试这个:
- (void)start
{
x = (arc4random_uniform(1000) + 1);
}
当您点击0或1时,您不希望仅增加x,因为这会使结果产生偏差。在这种情况下,arc4random_uniform将返回小于1000的随机数,因此0 - > 999,为所有值加1,给你1 - &gt; 1000.调整你的数字以满足你的需要。
您的代码中还有其他问题。为什么要创建自己的Number类?为什么要创建自己的排序方法?使用NSNumber和NSArray的排序方法。
这是一个更清洁的版本:
int main(int argc, const char * argv[])
{
@autoreleasepool
{
NSMutableArray* unsortedArray = [[NSMutableArray alloc] initWithCapacity:50];
for (NSUInteger n = 0; n < 50; ++n) {
[unsortedArray addObject:@(arc4random_uniform(999) + 1)];
}
for (NSUInteger n = 0; n < 50; ++n) {
printf("%li, ", (long)[unsortedArray[n] integerValue]);
}
printf ("unsorted array.\n\n");
NSArray* sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj2 compare:obj1];
}];
for (NSUInteger n = 0; n < 50; ++n) {
printf("%li, ", (long)[sortedArray[n] integerValue]);
}
printf("sorted array.\n");
}
return 0;
}