首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

算法大比拼,类型数组怎么实现乱序排列

2012-01-20 
算法大比拼,类型数组如何实现乱序排列我有一个C# codeMyClass[] myClassList如何打乱数组的顺序呢,随机的,

算法大比拼,类型数组如何实现乱序排列
我有一个

C# code
MyClass[] myClassList

如何打乱数组的顺序呢,随机的,求简洁或最优算法

ps:MyClass类中当然有个唯一标示属性。即GUID.

[解决办法]
不知道有没有好的写法?
C# code
            //设置顺序号以方便观察            MyClass[] myClassList = new MyClass[ 100 ];            for( int i = 0 ; i < myClassList.Length-1 ; i++ ) {                myClassList[ i ] = new MyClass( i );            }                        //随机顺序            Random rd = new Random( Environment.TickCount );            for( int i = 0 ; i < myClassList.Length - 1 ; i++ ) {                int x = rd.Next( 0, 99 );                int y = rd.Next( 0, 99 );                MyClass temp = myClassList[ x ];                myClassList[ x ] = myClassList[ y ];                myClassList[ y ] = temp;            }            MessageBox.Show( myClassList.Length.ToString() );
[解决办法]
不知道有没有好的写法...代码补全了
C# code
        class MyClass {            public Guid MyGuid { get; set; }            public int ID { get; set; }            public MyClass(int i) {                this.MyGuid = Guid.NewGuid();                this.ID = i;            }        }        private void button1_Click( object sender, EventArgs e ) {            //设置顺序号以方便观察            MyClass[] myClassList = new MyClass[ 100 ];            for( int i = 0 ; i < myClassList.Length-1 ; i++ ) {                myClassList[ i ] = new MyClass( i );            }                        //随机顺序            Random rd = new Random( Environment.TickCount );            for( int i = 0 ; i < myClassList.Length - 1 ; i++ ) {                int x = rd.Next( 0, 99 );                int y = rd.Next( 0, 99 );                MyClass temp = myClassList[ x ];                myClassList[ x ] = myClassList[ y ];                myClassList[ y ] = temp;            }
[解决办法]
List<MyClass> srcList = new List<MyClass>(myClassList);
List<MyClass> destList = new List<MyClass>(myClassList.Length);
System.Random rnd = new Random();
while (srcList.Count > 0)
{
int tmpIndex = rnd.Next(0, srcList.Count);
destList.Add(srcList[tmpIndex]);
srcList.RemoveAt(tmpIndex);
}
MyClass[] destMyClassList = destList.ToArray();
[解决办法]
C# code
MyClass[] myClassList = ...;byte[] keys = new byte[myClassList.Length];(new Random()).NextBytes(keys);Array.Sort(keys, myClassList);
[解决办法]
//谢狼兄,又学到新内容了,陌生的概念啊,备注下
http://jonny131.javaeye.com/blog/188829
C# code
                /*         * 线性同余法求伪随机数的公式:          * X(n+1) = (a Xn + c) mod m         */        uint Rand( uint seed ) {            return (uint)( seed * 1103515245 + 12345 ) % 32768;        }
[解决办法]
探讨
引用:
C# codeMyClass[] myClassList= ...;byte[] keys=newbyte[myClassList.Length];
(new Random()).NextBytes(keys);
Array.Sort(keys, myClassList);


进行Sort没有必要!选择两个[0...myClassList.Length)之间的随机数,把它们做下标的两个元素交换位置。这样重复超过 myClassList.Length/2 次就可以了。

[解决办法]
偶用的洗牌算法,感觉效果还不错
int temp, index0;
for (int i = 1; i < len; i++) //洗牌算法
{
index0 = ra.Next(i);
temp = Sequence[index0];


Sequence[index0] = Sequence[i];
Sequence[i] = temp;
}

其中Sequence[]本来是一个顺序序列,执行后变成随机序列了
[解决办法]
ArrayList^ myList=gcnew ArrayList;
//乱序
int i ,j;
Random^ myRandom=gcnew Random;
Object^ tem;
for(i=0;i< myList ->Count ;i++)
{
j= myRandom->Next (i,myList->Count );
tem= myList[i];
myList[i]=myList[j];
myList[j]=tem;
}
[解决办法]
T MyArray = new T{...};
int i = 0;
int index;
Random random = new Random();
T temp;

while (i < MyArray.Length)
{
index = random.Next(MyArray.Length - i);
temp = MyArray[index];
MyArray[index] = MyArray[MyArray.Length - i];
MyArray[MyArray.Length - i] = temp;
i ++;
}
[解决办法]
RANDOMIZE-IN-PLACE(A)
1 n ← length[A]
2 for i ← to n
3 do swap A[i] ? A[RANDOM(i, n)]


[解决办法]

C/C++ code
AssignListArray(array, LENGTH);for (int i=LENGTH; i>=0; i--){    int index = rand() % i;    int tmp = array[i];    array[i] = array[index];    array[index] = tmp;} 

热点排行