更改数组中确切数量的元素的位置

时间:2014-08-02 12:59:22

标签: c arrays

假设我们有一个 m个元素数组,我们想要随机改变 n 的位置当然,其中2< = n< = m。

例如:如果我们有 10 整数数组{1 2 3 4 5 6 7 8 9 10},我们要求 4 更改其元素随机定位,结果可能是{3 2 1 4 5 6 10 8 9 7}

在ANSI C中对此进行编程的最简单方法是什么? (伪代码也会很好)

2 个答案:

答案 0 :(得分:0)

步骤1)。生成1到m之间的n个随机唯一数字的列表。不应对此列表进行排序。例如,对于您的示例,列表可能是[10,7,1,3]

步骤2)做类似的事情:

int save = array[list[0]];
For (i=0; i<n-1; i++) {
  Array[list[i]] = array[list[i+1]];
}
Array[list[n-1]] = save;

编辑:实际上,你必须从每个列表中减去1 [无论如何]以允许从零开始的数组 - 但我相信你明白了这一点:)

答案 1 :(得分:0)

因为必须交换至少两个数字,我会首先从数组中选择两个随机数,然后交换它们。它们被添加到包含交换索引的数组中。如果有更多的交换,请选择与交换的数字不同的另一个数字,并将其与之前交换的数字交换。

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

void print_arr(int a[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        printf("%d ",a[i]);
    }
        printf("\n");
}

void swap(int a[], int i, int j) {
    int temp = a[i];
    a[i] = a[j];
    a[j] = temp;
}

int next_idx(int swapped[], int s_count, int size) {
    int n, i;
    char in_arr;
    while (1) {
        in_arr = 0;
        n = rand() % size;
        for (i = 0; i < s_count; i++) {
            if (swapped[i] == n) {
                in_arr = 1;
                break;
            }
        }
        if (!in_arr) {
            break;
        }
    }
    return n;
}

void swap2_or_more(int a[], int size,int count) {
    srand(time(NULL));
    int i, j, s_count = 0;
    int swapped[size];
    i = rand() % size;
    swapped[s_count] = i;
    s_count++;
    do {
        j = rand() % size;
    } while (i == j);  // make sure indexes are different
    swapped[s_count] = j;
    s_count++;

    swap(a, i, j);
    count -= 2;
    while (count) {
        i = next_idx(swapped, s_count, size);
        j = rand() % s_count;
        swap(a, i, swapped[j]);
        swapped[s_count] = i;
        s_count++;
        count--;
    }
    printf("swapped indexes:\n");
    print_arr(swapped, s_count);
}

int main(void)
{
    int a[] = {1,2,3,4,5,6,7,8,9,10};
    swap2_or_more(a, 10, 5);
    printf("array after swap:\n");
    print_arr(a, 10);
    return 0;
}