C++ 算法 排序 从中间向左右两边依次递减排序

问题:

现有一整型数组int input[]={...};

如果数组元素个数是奇数,则以中间一个为最大,左边第一个次之,右边第一个再次之。。。如此排序后,最左边第二小,最右边最小

如果数组元素个数是偶数,则以中间两个的右边那个为最大,左边第一个次之,右边第一个再次之。。。如此排序后,最右边第二小,最左边最小

举例:

奇数个如:input[]={3,4,8,1,9};

排序后:input[]={3,8,9,4,1};

偶数个如:input[]={3,4,8,1,9,6};

排序后:input[]={1,4,8,9,6,3};

 

思路:

写出一算式,index=X(n);随着n从0->n,算出的X(n)从中间位置->左1->右1...如此直到最后:

X(n)=iMiddle+(-1)indexindex/2;

即从即第一个数为iMiddle+(+1)*0

第二个数 为iMiddle+(-1)*1/2 (取整后为iMiddle-1)

第三个数 为iMiddle+(+1)*2/2 (即iMiddle+1)

然后用一种排序算法进行排序

 1 #include <iostream>
 2 #include <math.h>
 3 using namespace std;
 4 
 5 inline int iCalcIndex(int iInMiddle, int iInSerial)
 6 {
 7     return iInMiddle+pow(-1,iInSerial)*iInSerial/2;
 8 }
 9 
10 int main()
11 {
12     int input[] = {1,2,3,4,5};
13     int iCountOfInput = sizeof(input)/sizeof(int);
14     int iMiddle = iCountOfInput/2;
15     int temp = 0;
16     int iIndexSmall = 0;
17     int iIndexBig = 0;
18 
19     for(int i=0; i<iCountOfInput; i++)
20     {
21         for(int j=0; j<iCountOfInput-i; j++)
22         {
23             iIndexSmall = iCalcIndex(iMiddle,j);
24             iIndexBig = iCalcIndex(iMiddle,j+1);
25             
26             if (input[iIndexSmall]<input[iIndexBig])
27             {
28                 /*temp = input[iIndexSmall];
29                 input[iIndexSmall] = input[iIndexBig];
30                 input[iIndexBig] = temp;*/
31                 input[iIndexSmall]=input[iIndexSmall]^input[iIndexBig];
32                 input[iIndexBig] = input[iIndexSmall]^input[iIndexBig];
33                 input[iIndexSmall] = input[iIndexSmall]^input[iIndexBig];
34             }
35         }
36     }
37 
38     for(int i=0; i<iCountOfInput; i++)
39         cout<<input[i];
40     cout<<endl;
41 
42     return 0;
43 }

运行结果:
24531
符合预期 (如果将输入改为123456,则结果为135642)

 

posted on 2017-02-27 20:15 dengnilikai 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/dengnilikai/p/6476085.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值