【问题标题】:C shellsorting random int arrayC shellsorting随机整数数组
【发布时间】:2015-09-07 00:47:26
【问题描述】:

我在编写简单的程序以 shellsort 随机数数组时遇到了问题。程序不对它进行排序,只是打印 1,1,1,1,1 或 0,0,0,0,0 即使 shellsort 算法来自 Rosettacode 所以它应该是正确的。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void shell_sort (int *a, int n) {
    int h, i, j, t;
    for (h = n; h /= 2;) {
        for (i = h; i < n; i++) {
            t = a[i];
            for (j = i; j >= h && t < a[j - h]; j -= h) {
                a[j] = a[j - h];
            }
            a[j] = t;
        }
    }
}

int main ()
{
    int i;
    int array[100000];
    srand(time(NULL));

    for (i = 0; i < 100000; i++)
    {
        array[i] = rand() % 1000 + 1;
    }

    for (i = 0; i < 5; i++)
        printf("%d%\n", array[i]);

    shell_sort(array, 100000);

    for (i = 0; i < 5; i++)
        printf("%d%\n", array[i]);

    return 0;
}

【问题讨论】:

  • 您生成了 100,000 个 1 - 1000 范围内的随机数,然后只查看前五个。其中前 100 个可能都是 1。首先尝试使用包含 10 个数字的列表的代码。
  • @koper 我已经说明了蜥蜴比尔所说的话。应该有用:)

标签: c shellsort


【解决方案1】:

你的程序在我系统中的输出是:

94 76 444 792 967 1 1 1 1 1

另一个实例给出输出:

665 777 481 269 215 1 1 1 1 1

所以,你可以猜到生成的随机数肯定有很多个。

但是,如果我更改您的这段代码:

for (i = 10; i < 10005; i++)
    printf("%d\n", array[i]);

shell_sort(array, 100000);

for (i = 10; i < 1005; i++)
    printf("%d\n", array[i]);

输出是:

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

问题不在于算法,而在于生成随机数的方式。

我只是进一步改变这一行,

 for (i = 0; i < 100000; i++)
    {
        array[i] = rand() + 1;  // Removed the modulus
    }

输出是:

228 228 228 229 229 229 229 229 229 230 230 230 232 232 232 233 233 234 234 236 236 236 236 237 237 237 237 237 237 238 238 238 238 239 239 239 240 240 241 241 241 241 241 242 242 242 243 244 245 245 245 245 245 245 245 246 246 248 248 248 249 249 249 249 250 250 250 250 250 250 251 251 252 253 253 253 253 253 254 254 255 256 256 257 257 257 257 259 259 260 260 261 261 261 261 262 262 262 262 263 264 264 264 265 265 265 266 266 266 266 266 266 267 267 267 267 267 267 268 268 269 269 269 269 270 270 270 270 271 272 272 272 273 273 273 274 275 275 275 275 276 276 277 277 277 277 277 277 279 279 279 279 279 280 280 280 280 280 280 280 280 280 281 281 281 281 282 282 283 283 284 284 284 285 285 285 286 286 287 287 287 287 287 288 289 289 289 289 289 290 290 291 291 292 292 292 293 293 293 294 294 294 295 295 295 295 295 296 296 297 297 298 298 298 298 298 299 299 299 299 300 300 300 300 300 301 301 303 303 303 304 304 304 305 305 305 305 306 306 307 308 308 309 310 310 310 311 311 311 311 312 312 312 313 314 314 314 314 316 316 316 316 316 316 317 317 317 317 317 317 318 319 319 319 319 320 320 321 321 321 322 322 322 322 326 326 326 326 326 327 327 327 328 328 329 329

所以,一切都很好。只需以更好的方式使用随机数即可。

【讨论】:

  • 如果RAND_MAX == INT_MAX 很可能,如果返回RAND_MAX,则将1 添加到有符号整数会产生溢出。那是未定义的行为。见here
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 2011-06-26
  • 2020-07-16
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多