如何在C语言中对含重复元素数组洗牌,使重复元素间隔至少为2?
带重复元素的数组间隔洗牌实现(C语言)
需求说明
对包含重复元素的数组进行洗牌,要求相等元素的间隔至少为2:即同一元素再次出现前,必须有至少2个不同的元素。例如:
- 合法结果:
[3,1,2,3,1,2] - 非法结果:
[3,1,3,2,1,2](第二个3和第一个3之间仅存在1个不同元素)
最终目标是编写通用程序,可处理包含n个不同值的数组,实现最大间隔为n-1的洗牌(比如间隔要求为3时,数组需至少包含4个不同元素)。
现有Fisher-Yates洗牌代码
当前使用的Fisher-Yates洗牌代码无法满足间隔要求,代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> int main(void){ int num[] = {1, 1, 2, 2, 3, 3}; // 待洗牌的目标数组 int swap; int i, j; srand(time(NULL)); for(i = 1; i < 6; i++){ // Fisher-Yates洗牌开始 j = rand() % (i + 1); if(j != i){ swap = num[j]; num[j] = num[i]; num[i] = swap; } } // Fisher-Yates洗牌结束 // 打印数组 printf("\nThe array is [ "); for(i = 0; i < 6; i++){ printf("%d ", num[i]); } printf("]"); }
已尝试的思路
曾尝试通过计数器检查当前元素后2个索引的取值,以此判断是否执行洗牌交换操作,但尚未实现符合要求的通用逻辑。
内容的提问来源于stack exchange,提问作者Nikhil Vishnoi
相关产品推荐
相关产品推荐

