⑴ 用c語言對數組內元素亂序排列並輸出
方法1:比較笨的辦法是先排好。再在裡面找。看是原來的第幾個。 (代碼我就不寫了。)
方法2:有一個很快的方法,就是用快速排序排,
如果你深入的了解了快排,那麼這個就很簡單了。而且效率很高。
我給你寫代碼。
⑵ c語言如何隨機打亂數組
int a[] = {3,5,7,1,4};
// 本程序考慮時間復雜度最小情況的亂序演算法,O(t)=len-1
// 演算法模仿彩票搖號,從全集中先取一個為第一位,再在剩餘集合中取出一個為第2位,...
// 直至最後一個,只是考慮空間利用,已排序集合利用全集的空間。
int len=sizeof(a); // 全集元素數量
srand(unsigned(time(NULL))); // 搖號機准備
for(int i=len;i>1;i--) // 從全集開始搖號,直至只剩一個,已排在最後
{
int cur=len-i+(rand()%i); // 在剩餘集合中搖號
int tmp=a[len-i]; // 當前序號位置挪空
a[len-i]=a[cur]; // 搖出的綵球放入當前序號
a[lcur]=tmp; // 放好剩餘的綵球
}
⑶ 怎樣用C語言打亂一個已排序的數組
如果要求不是很嚴格的話,感覺可以隨機交換N次,每次交換,隨機生成兩個交換的元素的下標。
如果要求嚴格隨機的話,感覺可以依次從數組里無放回的取數,並按照取數的先後順序放入一個新的數組,然後新的數組就是打亂順序之後的數組了。
⑷ 求一個數組打亂演算法,C語言版本
objectMainextendsApp{
varreverse_pairs = 0//逆序數
defmsort[T](cmp:(T, T) => Boolean)(l:List[T]):List[T] = {
defmerge(l1:List[T], l2:List[T]):List[T]=(l1, l2)match{
case(Nil, _) => l2
case(_, Nil) => l1
case(x::left1, y::left2) =>
if(cmp(x, y))
x::merge(left1, l2)
else{
reverse_pairs += l1.length
y::merge(l1, left2)
}
}
valn = l.length / 2
if(n == 0)
return l
else{
val(l1, l2) = l.splitAt(n)
merge(msort(cmp)(l1), msort(cmp)(l2))
}
}
println(msort((x:Int, y:Int) => x<y)(List(5, 4, 3, 2, 7,6 )))
println(reverse_pairs)
}
⑸ 怎樣使數組元素亂序
這個不叫亂序,這個叫排列組合。。。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 計算 n!
int fact(int n)
{
long f;
if (n ==0 || n == 1)
{
return 1;
}
else
{
return fact(n-1)*n;
}
}
void permutationAndCombination
(
// 基本參數
int data[],int dataSize,int selectNum,
// 遞歸用到的參數
int flag[],int count,
// 選擇排列的結果
int ***result ,int *resultSize
)
{
int i;
int totalSelectMethods = fact(dataSize)/fact(dataSize-selectNum);
if(flag == NULL || (*result) == NULL)
{
flag = (int*)malloc(sizeof(int)*dataSize);
memset(flag,0,sizeof(int)*dataSize);
(*result) = (int**)malloc(sizeof(int*)*totalSelectMethods);
for(i=0;i<totalSelectMethods;i++)
{
(*result)[i] = (int*)malloc(sizeof(int)*selectNum);
}
*resultSize = 0;
}
if(selectNum == count)
{
(*resultSize) ++;
if((*resultSize) < totalSelectMethods)
{
for(i=0;i<selectNum;i++)
{
(*result)[*resultSize][i] = (*result)[(*resultSize)-1][i];
}
}
}
else
{
// 注意終止條件: (dataSize - i) >= (selectNum - count)
for(i = 0;i < dataSize ; i++)
{
if(flag[i] == 0)
{
(*result)[*resultSize][count] = data[i];
flag[i] = 1;
permutationAndCombination
(
data,dataSize,selectNum,
flag,count+1,
result,resultSize
);
flag[i] = 0;
}
}
}
}
int main(int argc, char *argv[])
{
int n,i,j;
int *data=NULL;
int **result = NULL,resultSize = 0;
while(scanf("%d",&n)!=EOF)
{
// 初始化排列組合用的整數數組,元素為:1~n
data = (int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
{
data[i] = i+1;
}
// 進行排列組合
permutationAndCombination
(
data,n,n,
NULL,0,
&result,&resultSize
);
for(i=0;i<resultSize;i++)
{
printf("第%3d種方案:",i+1);
for(j=0;j<n;j++)
{
printf("%d ",result[i][j]);
}
printf("\n");
}
}
return 0;
}
/*
4
第 1種方案:1 2 3 4
第 2種方案:1 2 4 3
第 3種方案:1 3 2 4
第 4種方案:1 3 4 2
第 5種方案:1 4 2 3
第 6種方案:1 4 3 2
第 7種方案:2 1 3 4
第 8種方案:2 1 4 3
第 9種方案:2 3 1 4
第 10種方案:2 3 4 1
第 11種方案:2 4 1 3
第 12種方案:2 4 3 1
第 13種方案:3 1 2 4
第 14種方案:3 1 4 2
第 15種方案:3 2 1 4
第 16種方案:3 2 4 1
第 17種方案:3 4 1 2
第 18種方案:3 4 2 1
第 19種方案:4 1 2 3
第 20種方案:4 1 3 2
第 21種方案:4 2 1 3
第 22種方案:4 2 3 1
第 23種方案:4 3 1 2
第 24種方案:4 3 2 1
*/
⑹ 怎樣使數組元素亂序
用遞歸吧,總體思想是:
第i個的取值的方法是:從讓第i個取1到N,如果前i-1都沒有取這個值,則第i個取這個值。
#define N 4
int a[N];
bool randArry(int iIndex)
{
if(N == iIndex)
{
for(int i = 0; i < N; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
return true;
}
int iValue = 1;
//嘗試每一個值
while(iValue <= N)
{
bool bFind = false;
//查看前幾個數字是否已經取了該值
for(int i = 0; i < iIndex; i++)
{
if(iValue == a[i])
{
bFind = true;
break;
}
}
if(true == bFind)
{
iValue++;
continue ;
}
a[iIndex] = iValue;
randArry(iIndex + 1);
iValue++;
}
return true;
}
int main()
{
//賦初始值
for(int i = 0; i< N ; i++)
{
a[i] = 0;
}
randArry(0);
return 0;
}
⑺ C語言中如何將數組亂序
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int main()
{
int a[] = {3,5,7,1,4};
int n=5;
int i,j,T=1000,tmp;
srand(unsigned(time(NULL)));
while(T--)
{
i=rand()%n;
j=rand()%n;
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
for(i=0;i<n;i++)printf("%d ",a[i]);
puts("");
return 0;
}
⑻ C語言中如何將數組亂序
可以這樣:
srand(time(0));
for(i=0;i<N;i++)
{
m=rand()%9;
n=rand()%9;
t=a[m];
a[m]=a[n];
a[n]=t;
}
就是每次生成兩個0到8之間的隨機數,然後以它們作為下標,交換兩個位置的數字,只要N足夠大,應該能夠達到要求
⑼ 用C語言怎樣打亂一組數據
#pragma
once
#include
<iostream>
#include
<Windows.h>
using
namespace
std;
#pragma
comment(
lib,
"winmm.lib"
)
int
main()
{
//定義一個數組(自己隨便定義,這里以10個大小的數組為例)
const
int
iSum
=
10;
int
iAry[iSum]
=
{3,7,5,87,23,1,65,8,51,64};
//定義一個數組用來保存打亂順序後的數
int
iDistrubAry[iSum]
=
{0};
//播隨機種子(以便每次隨機的值有相等的機會)
srand(timeGetTime());
//每次隨機的不相同的數存到這個數組里(以便下次隨機時判斷隨機的數是否已經隨機過了)
int
iRandomData[iSum]
=
{0};
//將iRandomData元數都賦初值為-1,表示沒有產生一個隨機數
for
(
int
i=0;
i<iSum;
i++
)
{
iRandomData[i]
=
-1;
}
//共產生不同的隨機的個數
int
iRandomSum
=
0;
//打亂這個數組
for
(
int
i=0;
i<iSum;
i++
)
{
//隨機一個數
int
iRandom
=
rand()%iSum;
//判斷iRandomSum是否為0,是0的話表示沒有隨機過任何數,就不用查詢是否隨機到這個數了
if
(
iRandomSum
!=
0
)
{
//用來判斷是否連續隨機(當隨機的數與之前隨機的有重復時就連續隨機)
for
(
int
i=0;
i<iRandomSum;
i++
)
{
if
(
iRandom
==
iRandomData[i]
)
{
iRandom
=
rand()%iSum;
//i要賦值為-1,表示重新查詢是否與以前隨機的數重復
i
=
-1;
}
}
}
//將產生的隨機數添加到RandomData裡面
iRandomData[iRandomSum]
=
iRandom;
//將隨機的數作為原來數組的索引,取出原來數組此索引的值保存在打亂後的數組中
iDistrubAry[iRandomSum]
=
iAry[iRandom];
//將iRandom加1,表明已經打亂好了一個數
iRandomSum++;
}
//顯示未打亂的數組
cout<<"未打亂的數組:";
for
(
int
i=0;
i<iSum;
i++
)
{
cout<<iAry[i]<<"
";
}
cout<<endl;
//顯示打亂後的數組
cout<<"打亂後的數組:";
for
(
int
i=0;
i<iSum;
i++
)
{
cout<<iDistrubAry[i]<<"
";
}
cout<<endl;
system(
"pause"
);
}
⑽ 一個C語言的小問題,把一個數組隨機打亂的代碼,代碼如下
因為i=9的時候,執行_rand(i,9);時,在函數_rand里,a為9,b為9,由於i=rand()%b; 所以i最大為8,所以在 if(i<a) goto Y; 這個地方會永遠跳回到Y。就這么死循環了。