跳转至

随机排列算法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 10       //定义数组的长度为10 

void randomizeInPlace(int array[], int length) {  //对长度为length的数组array[]进行随机排列 
    int i;
    for (i = 0; i < length; i++) {
        int rnd = i + (rand() % (length - i));  //生成[i, length-1)范围内的一个随机下标 
        //交换 array[i]与array[rnd] 
        int temp = array[i];          
        array[i] = array[rnd];
        array[rnd] = temp;
    }   
}

int main() {
    srand(time(NULL));  //设置时间函数time(NULL)为随机数种子 
    int array[N];
    int i, j;
    for (i = 0; i < N; i++) {  //为原数组赋初值 
        array[i] = i + 1;
    }
    printf("原数组为:");      //打印输出原数组 
    for (i = 0; i < N; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    int times;
    printf("请输入随机重排的次数:");
    scanf("%d", &times);       //用户指定随机重排的次数
    for (j = 0; j < times; j++) {
        randomizeInPlace(array, N);  //每次随机排列都是在上次随机排列的数组基础之上  
        printf("随机重排%d次的数组为:", j + 1); 
        for (i = 0; i < N; i++) {
            printf("%d ", array[i]);
        }
        printf("\n");
    }
    return 0;
}