将一个给定的数组洗牌,要求时间复杂度O(n),空间复杂度1:
#include<stdio.h> int randomNum(int start,int end); int shuffle(int *a,int len); int main(void){ int a[10]={0,1,2,3,4,5,6,7,8,9}; int i; printf("洗牌前的数组:"); for(i=0;i<10;i++){ printf("%d ",a[i]); } srand(time(NULL));//刷新随机数 shuffle(&a,10); printf(" 洗牌后的数组:"); for(i=0;i<10;i++){ printf("%d ",a[i]); } return 1; } int randomNum(int start,int end){//产生指定范围随机数[start,end) int r=rand()%end; while(r<start) r=rand()%end; return r; } int shuffle(int *a,int len){ //洗牌函数 int i,addr,tmp; for(i=0;i<len;i++){//遍历一次实现洗牌 addr=randomNum(i,len); tmp=a[i]; a[i]=a[addr]; a[addr]=tmp; } }