今天遇到一个测试题:对一个整型随机数组成数组进行排序,奇数从小到大,偶数从大到小,只能用现有的数组,不能在开辟临时的数组存储空间,当然还要求优化效率。
于是本人琢磨着写了一个,基本要求是实现啦,可是效率不高,需要优化算法,希望感兴趣的朋友来优化下,或者 提出 你的宝贵建议.在此先谢过啦。
废话不多说,一切尽在代码中:
//Start
#include "stdafx.h"
#include <iostream>
using namespace std;
void SeparateOdd_Even(int* pAry,int len);
void OddAscSort(int* pAry,int start, int end);
void EvenDscSort(int* pAry,int start, int end);
int GetOddEvenBound(int* pAry,int len);
void DispResult(int* pAry, int len);
int _tmain(int argc, _TCHAR* argv[])
{
int BOUND = 0;
const int MAX = 10;
int ary[MAX] = {13,24,83,25,10,59,86,98,23,44};
//分开奇偶
SeparateOdd_Even(ary, MAX);
cout<<"分开奇偶: ";
DispResult(ary,MAX);
//获取奇偶分界
BOUND = GetOddEvenBound(ary, MAX);
//排序奇数从小到大冒泡排序
OddAscSort(ary, 0, BOUND);
//排序偶数从大到小冒泡排序
EvenDscSort(ary, BOUND, MAX);
//排序后的输出
cout<<"排序结果: ";
DispResult(ary,MAX);
return 0;
}
/*分开奇偶,奇前偶后*/
void SeparateOdd_Even(int* pAry,int len)
{
int i = 0;
int j = 0;
int temp = 0;
for (i=0; i<=len; i++)
{
if (pAry[i]%2 == 0) //当前为偶数
{
for (j=len-1; j>i; j--)
{
if (pAry[j]%2!=0) //此偶数和其后面:从最后开始往回数的奇数交换
{
temp = pAry[i];
pAry[i] = pAry[j];
pAry[j] = temp;
}
else
{
continue;
}
}
}
}
}
/*奇数从小到大冒泡排序*/
void OddAscSort(int* pAry,int start, int end)
{
int i = 0;
int j = 0;
int temp = 0;
for (i=start; i<end; i++)
{
for (j=i+1;j<end;j++)
{
if (pAry[i]>pAry[j])
{
temp = pAry[i];
pAry[i] = pAry[j];
pAry[j] = temp;
}
}
}
}
/*偶数从大到小冒泡排序*/
void EvenDscSort(int* pAry,int start, int end)
{
int i = 0;
int j = 0;
int temp = 0;
for (i=start; i<end; i++)
{
for (j=i+1;j<end;j++)
{
if (pAry[i]<pAry[j])
{
temp = pAry[i];
pAry[i] = pAry[j];
pAry[j] = temp;
}
}
}
}
/*获取分开奇偶边界*/
int GetOddEvenBound(int* pAry,int len)
{
for (int i=0;i<len;i++)
{
if (pAry[i]%2==0)
{
return i;
}
}
}
/*显示结果*/
void DispResult(int* pAry, int len)
{
int i=0;
for (i=0; i<len; i++)
{
cout<<pAry[i]<<" ";
}
cout<<endl;
}
//END
结果 :
结果正确
小节:
此题主要是对冒泡排序的一个练习。可定还有更好的方法,希望各位能人不吝赐教!
====最后补充下:此题目为:XX = GameLoft笔试题
(成都区)
之一,请大家自己知道就好!=====