实现排序函数,对一个整形序列进行排序,要求奇数在前,偶数在后。
如序列 1,2,3,4,5,6,排序后为 1,3,5,2,4,6。
函数原型:void sort(int src[], int len);
法 1:先将数组放在一个 vector 中,然后对 vector 整体进行排序,然后扫描两边,第一遍找出所有奇数,按数序放入 src 中,第二遍只找偶数,按数序放在奇数之后。此法需要额外的空间,当数据较大时,内存消耗大。
// C++ 实现
void sort(int src[], int len)
{
vector<int> v(src, src + len);
sort(v.begin(), v.end()); // 将数组元素放在 vector 中,整体排序
int k = 0;
for (int i = 0; i < len; i++) // 扫描 vector,找出全部奇数,按顺序放在前面
{
if (v[i] % 2 == 1)
{
src[k++] = v[i];
}
}
for (int j = 0; j < len; j++) //找出全部偶数,按顺序放在奇数后面
{
if (v[j] % 2 == 0)
{
src[k++] = v[j];
}
}
return;
}
法 2:双端指针,首尾指针分别向中间扫描,首指针查找偶数,尾指针查找奇数,如果奇数位置在偶数后面则两数对换,最终使前面部分是奇数,后部分是偶数。然后分别对奇数和偶数部分进行排序。不需要额外空间。
// C++ 实现
void sort(int src[], int len)
{
int i = 0, j = len - 1;
// 双向扫描,将奇数都对换到前面,偶数对换到后面
while (i < j)
{
while(src[i] % 2 == 1) // 查找偶数
{
i++;
}
while(src[j] % 2 == 0) // 查找奇数
{
j--;
}
if (i < j) // 当奇数在偶数右边时对换
{
int temp = src[i];
src[i] = src[j];
src[j] = temp;
i++;
j--;
}
}
sort(src, src + i); // 奇数单独排序
sort(src + i, src + len); //偶数单独排序
return;
}