0
点赞
收藏
分享

微信扫一扫

完美洗牌算法(1)

dsysama 2023-04-25 阅读 100


题目描述;


    有一个长度为2n的数组{a1,a2,a3,...,an,b1,b2,...,bn},希望排序后变成{a1,b1,a2,b2,...an,bn}.


解法1:


位置置换算法


设定数组下标从

1开始

原始序列

A1

A2

A3

A4

B1

B2

B3

B4

数组下标

1

2

3

4

5

6

7

8

最终序列

B1

A1

B2

A2

B3

A3

B4

A4

通过对比原始序列与最终前后位置的变化


前n个元素中(1->2,2->4,2->6,4->8)


推广到一般情况,前n个元素中,第i个元素去了第2i个元素的位置


后n个元素中(5->1,6->3,7->5,8->7)


推广到一般情况,后n个元素中,第i个元素去了第2(i-n)-1=

2i-(2n+1 )=2i%(2n+1 )

综合到任意情况,任意的第i个元素都最终换到了(2i)%(2n+1)的位置

c代码如下:

此处)折叠或打开


1. #include<stdio.h>
2. <stdlib.h>
3.  #define N 9
4. (t,x,y) (t = (x),x = (y),y = (t))
5. int b[N];
6. (int *a,int n)
7. {
8. int i = 0,n1 = 2*n,temp = 0;
9. for (i = 1;i <= n1 ;i++)
10. {
11. [(2*i)%(2*n+1)] = a[i];//这里不要写成2i,2n,忘了*
12. }
13. for (i = 1;i <= n1 ;i++ )
14. {
15. [i] = b[i];
16. }
17. for (i = 2;i<= n1 ;i += 2 )//交换a[1]和a[2],a[3]和a[4]...
18. {
19. (temp,a[i-1],a[i]);
20. }
21. }
22. int main()
23. {
24. int a[9] = {0,1,2,3,4,5,6,7,8};
25. (a,4);
26. int i = 0;
27. for (i = 1;i <=8;i++)
28. {
29. ("%d ",a[i]);
30. }
31. ("\n");
32. ;
33. }

运行结果如下:


[root@localhost ~]# ./a.out


1 5 2 6 3 7 4 8


[root@localhost ~]#   


此程序的时间复杂度是o(n),空间复杂度也是o(n).




举报

相关推荐

0 条评论