算法学习 交叉排序
/* 对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放, 且输出数组第一位放奇数 若奇数和偶数不等长,则把剩下的直接放到数组中。 */ #include <cstdio> #include <cstdlib> #include <cstring> int comp(const void *p, const void *q) { return (*(int *)p - *(int *)q); } void sorts(int a[],int n) { int odd=0,even=0; int even_num=0,odd_num=0; int *r =a; int even_arr[100]={0}; int odd_arr[100]={0}; int *p_even = even_arr; int *p_odd = odd_arr; int *p = even_arr; int *q = odd_arr; for(int i=0;i<n;i++) { if(a[i]%2 == 0)//偶数 { even_num++; *p_even++ = a[i]; } else//奇数 { odd_num++; *p_odd++ = a[i]; } } qsort(even_arr,even_num,sizeof(even_arr[0]),comp); //偶数从大到小排列 qsort(odd_arr,odd_num,sizeof(odd_arr[0]),comp); //奇数从小到大排列 while(odd<odd_num && even<even_num) { *r++ = *q++; odd++; *r++ = *p++; even++; } while(even!=even_num&&odd!=odd_num) { if(even<even_num) { *r++ = *p++; even++; } while(odd<odd_num) { *r++ = *q++; odd++; } } } int main(/*int argc, char **argv*/) { int i; int a[]={2,0,3,9,4,10,7,11,15,22,66,31,21,87,99,101,177}; int n=sizeof(a)/sizeof(a[0]); sorts(a,n); for(i=0;i<n;i++) printf("%d ",a[i]); return 0; }