給定一個數組,要求把數組內元素的順序隨機打亂,而後輸出,主要是要保證效率。

#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();  
    }  
}
相關文章
相關標籤/搜索