Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519497
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-07-07 10:50:34

题目描述;
    有一个长度为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. #include<stdlib.h>
  3. #define N 9
  4. #define swap(t,x,y) (t = (x),x = (y),y = (t))
  5. int b[N];
  6. void LocationReplace(int *a,int n)
  7. {
  8.     int i = 0,n1 = 2*n,temp = 0;
  9.     for (i = 1;i <= n1 ;i++)
  10.     {
  11.         b[(2*i)%(2*n+1)] = a[i];//这里不要写成2i,2n,忘了*
  12.     }
  13.     for (i = 1;i <= n1 ;i++ )
  14.     {
  15.         a[i] = b[i];
  16.     }
  17.     for (i = 2;i<= n1 ;i += 2 )//交换a[1]和a[2],a[3]和a[4]...
  18.     {
  19.         swap(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.     LocationReplace(a,4);
  26.     int i = 0;
  27.     for (i = 1;i <=8;i++)
  28.     {
  29.         printf("%d ",a[i]);
  30.     }
  31.     printf("\n");
  32.     return 0;
  33. }
运行结果如下:
[root@localhost ~]# ./a.out
1 5 2 6 3 7 4 8
[root@localhost ~]#   
此程序的时间复杂度是o(n),空间复杂度也是o(n).



阅读(737) | 评论(0) | 转发(0) |
0

上一篇:荷兰国旗问题

下一篇:完美洗牌算法(2)

给主人留下些什么吧!~~