1.题目要求:在一个整型数组中,将奇数全部放在偶数的左边,并且奇数列与偶数列按升序排序
2.直接上代码,代码有注释
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
int* r_bubble_sort(int*arr,int l,int end)//将偶数列按大小排序
{
//错误示范
//end=sz
assert(arr);
int i = 0;
//两层循环为王道
for (i = l; i < end; i++)
{
int j = 0;
int flag = 1;//判断排序是否完成,提高效率
//错误示范
//for(j=l;j<end-i;j++);
for (j = l; j <end-i+l; j++)
{
if (arr[j]>arr[j + 1])
{
//排序
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;//证明依旧有乱序的嫌疑
}
}
if (flag == 1)//证明升序完成,退出循环
{
break;
}
}
return arr;
}
int* l_bubble_sort(int*arr, int end)//将奇数列按大小排序
{
assert(arr);
int i = 0;
for (i = 0; i < end; i++)
{
int j = 0;
int flag =1;
for (j = 0; j <end-i; j++)
{
if (arr[j]>arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
return arr;
}
int* exchange(int*arr, int sz)
{
assert(arr);
int l = 0;
int r = sz - 1;
//1.依次找出左边为偶数的元素,确定下标
//2.依次找出右边为奇数的元素,确实其下标
//3.交换左右两个元素
while (l < r)
{
while (arr[l] % 2 != 0&&l<r)//找偶数,下标为l
{
l++;
}
while (arr[r] % 2 == 0&&l<r)//找奇数,下标为r
{
r--;
}
if (l < r)//确保偶数在奇数右边时继续交换
{
int tmp = arr[l];//创建临时变量辅助交换
arr[l] = arr[r];//将原来右边的奇数放在左边
arr[r] = tmp;//将原来左边的偶数放在右边
}
}
r = sz - 1;
l = 0;
int mid;
//找到奇数列最左边数的下标
//用二分查找提升效率
while (l < r)
{
mid = (l + r) / 2;
if (arr[mid] % 2 != 0)//但该项为奇数项时,l值为mid+1
{
l = mid + 1;
}
if (arr[mid] % 2 == 0)//当该项为偶数项时,r值为mid-1
{
r = mid - 1;
}
if (arr[mid] % 2 != 0 && arr[mid + 1] % 2 == 0)
//该项为奇数项且该项右边第一项为偶数项,所以该项就是最右奇数项
//跳出循环
{
break;
}
}
l = mid;//最右奇数项的下标
r = l + 1;//最左偶数项的下标
//由于奇偶排序的参数不同,所以需要两个函数
l_bubble_sort(arr, l);//排序奇数项
r_bubble_sort(arr, r, sz-1);//排序偶数项
return arr;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,11,13,14,16,0,12,21,32,-1,-6,31,31,35};
//数组内容可按需求更改
int sz = sizeof(arr) / sizeof(arr[0]);
exchange(arr, sz);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}