• 算法学习 交叉排序


    /*
    对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放,
    且输出数组第一位放奇数 
    若奇数和偶数不等长,则把剩下的直接放到数组中。 
    */
    #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; 
    } 
     
     
    

      

  • 相关阅读:
    Alpha、Beta、RC、GA版本的区别
    convertView
    Layouts
    Styles and Themes
    Android Studio
    Promise.race
    Base64
    NodeJS搭建HTTPS服务器
    CoreSeek
    Ping of Death
  • 原文地址:https://www.cnblogs.com/hanahimi/p/4806521.html
Copyright © 2020-2023  润新知