首页 > 代码库 > C++ 算法 排序 从中间向左右两边依次递减排序

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)

 

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