首页 > 代码库 > 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++ 算法 排序 从中间向左右两边依次递减排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。