给定一个数组,要求把数组内元素的顺序随机打乱,而后输出,主要是要保证效率。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 随机打乱一个数组
void random(int a[], int n)
{
	int index, tmp, i;
	srand(time(NULL));
	for (i = 0; i <n; i++)
	{
		index = rand() % (n - i) + i;
		if (index != i)
		{
			tmp = a[i];
			a[i] = a[index];
			a[index] = tmp;
		}
	}
}
int main()
{
	int a[] = {1, 2, 3, 4, 5};
	int i;
	random(a, 5);
	for (i = 0; i < 5; i++)
		printf("%d ", a[i]);
	printf("\n");
	system("pause");
	return 0;
}
这个算法其实简单,首先从全部元素中随机选取一个与第一个元素进行交换,而后在第二个以后选择一个元素与第二个交换,直到最后一个元素。这样能确保每一个元素在每一个位置的几率都是1/n。

把一个数组的顺序打乱,很经常使用的算法,好比洗牌。 java

下面用Java实现: 算法

import java.util.Random;  
  
public class RandomSort {  
    private Random random = new Random();  
    //数组大小  
    private static final int SIZE = 10;  
    //要重排序的数组  
    private int[] positions = new int[SIZE];  
      
    public RandomSort() {  
        for(int index=0; index<SIZE; index++) {  
            //初始化数组,如下标为元素值  
            positions[index] = index;  
        }  
        //顺序打印出数组的值  
        dwn();  
    }  
      
    //重排序  
    public void changePosition() {  
        for(int index=SIZE-1; index>=0; index--) {  
            //从0到index处之间随机取一个值,跟index处的元素交换  
            exchange(random.nextInt(index+1), index);  
        }  
        dwn();  
    }  
      
    //交换位置  
    private void exchange(int p1, int p2) {  
        int temp = positions[p1];  
        positions[p1] = positions[p2];  
        positions[p2] = temp;  
    }  
      
    //打印数组的值  
    private void dwn() {  
        for(int index=0; index<SIZE; index++) {  
            System.out.print(positions[index]+" ");           
        }  
        System.out.println();  
    }  
  
    public static void main(String[] args) {  
        RandomSort rs = new RandomSort();  
        rs.changePosition();  
        rs.changePosition();  
        rs.changePosition();  
    }  
}
相关文章
相关标签/搜索