题意:给一个数组,按照模3的结果进行排序(如果模3结果一样顺序可以随意),尽量节省空间,时间。
这个问题下午逛群看到的。
#include
int main()
{
int num[] = {1,3,5,33,7,4};
int n = 6;
for(int i = 0;i < 6;i ++)printf("%d ",num[i]%3);puts("");
int c1,c2,c0;
//c0 为从左起最后一个余数为0后一个元素的位置
//c2 为从右起第一个余数为2前一个元素的位置
//c1 用于中间元素扫描
c0 = 0,c2 = n - 1;
//确定c0,c2的位置
while(c0 < n && num[c0]%3 == 0)c0++;
while(c2 >= 0 && num[c2]%3 == 2)c2--;
//c1为c0的下一个位置
c1 = c0;
while(c0 < c2 && c1 <= c2)
{
if(num[c1]%3 == 0)
{
swap(num[c0],num[c1]);
c0++;
}
if(num[c1]%3 == 2)
{
swap(num[c2],num[c1]);
c2--;
}
if(num[c1]%3 == 1)c1++;
}
for(int i = 0;i < n;i ++)printf("%d ",num[i]%3);
return 0;
}