network sorting for short arrays
This commit is contained in:
		
							parent
							
								
									2f48effddc
								
							
						
					
					
						commit
						c67549a296
					
				
							
								
								
									
										113
									
								
								qsort.h
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								qsort.h
									
									
									
									
									
								
							@ -280,6 +280,119 @@ void myheapsort(INDEX n, DATA *ra,int typ=1)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//network up-sorting templates
 | 
				
			||||||
 | 
					//more elegant would be a double template with N and partial specialization, but this is not allowed in current C++ for non-member functions
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					#define CONDSWAP(i,j) if(data[i]>data[j]) {T tmp=data[i]; data[i]=data[j]; data[j]=tmp; parity^=1;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T> 
 | 
				
			||||||
 | 
					inline int netsort_0(T *data) {return 0;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					inline int netsort_1(T *data) {return 0;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					inline int netsort_2(T *data) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int parity=0;
 | 
				
			||||||
 | 
							CONDSWAP(0,1);
 | 
				
			||||||
 | 
					return parity;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					inline int netsort_3(T *data) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int parity=0;
 | 
				
			||||||
 | 
					                CONDSWAP(0,2);
 | 
				
			||||||
 | 
					                CONDSWAP(0,1);
 | 
				
			||||||
 | 
					                CONDSWAP(1,2);
 | 
				
			||||||
 | 
					return parity;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					inline int netsort_4(T *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int parity=0;
 | 
				
			||||||
 | 
					                CONDSWAP(0,2);
 | 
				
			||||||
 | 
					                CONDSWAP(1,3);
 | 
				
			||||||
 | 
					                CONDSWAP(0,1);
 | 
				
			||||||
 | 
					                CONDSWAP(2,3);
 | 
				
			||||||
 | 
					                CONDSWAP(1,2);
 | 
				
			||||||
 | 
					return parity;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					inline int netsort_5(T *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int parity=0;
 | 
				
			||||||
 | 
					                CONDSWAP(0,3);
 | 
				
			||||||
 | 
					                CONDSWAP(1,4);
 | 
				
			||||||
 | 
					                CONDSWAP(0,2);
 | 
				
			||||||
 | 
					                CONDSWAP(1,3);
 | 
				
			||||||
 | 
					                CONDSWAP(0,1);
 | 
				
			||||||
 | 
					                CONDSWAP(2,4);
 | 
				
			||||||
 | 
					                CONDSWAP(1,2);
 | 
				
			||||||
 | 
					                CONDSWAP(3,4);
 | 
				
			||||||
 | 
					                CONDSWAP(2,3);
 | 
				
			||||||
 | 
					return parity;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					inline int netsort_6(T *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					int parity=0;
 | 
				
			||||||
 | 
					                CONDSWAP(0,5);
 | 
				
			||||||
 | 
					                CONDSWAP(1,3);
 | 
				
			||||||
 | 
					                CONDSWAP(2,4);
 | 
				
			||||||
 | 
					                CONDSWAP(1,2);
 | 
				
			||||||
 | 
					                CONDSWAP(3,4);
 | 
				
			||||||
 | 
					                CONDSWAP(0,3);
 | 
				
			||||||
 | 
					                CONDSWAP(2,5);
 | 
				
			||||||
 | 
					                CONDSWAP(0,1);
 | 
				
			||||||
 | 
					                CONDSWAP(2,3);
 | 
				
			||||||
 | 
					                CONDSWAP(4,5);
 | 
				
			||||||
 | 
					                CONDSWAP(1,2);
 | 
				
			||||||
 | 
					                CONDSWAP(3,4);
 | 
				
			||||||
 | 
					return parity;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef CONDSWAP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T>
 | 
				
			||||||
 | 
					int netsort(const int n, T *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					if(n<0) laerror("negative n in netsort");
 | 
				
			||||||
 | 
					switch(n)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						case 0:
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							return netsort_2(data);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 3:
 | 
				
			||||||
 | 
							return netsort_3(data);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 4:
 | 
				
			||||||
 | 
							return netsort_4(data);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 5:
 | 
				
			||||||
 | 
							return netsort_5(data);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 6:
 | 
				
			||||||
 | 
							return netsort_6(data);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return ptrqsortup<T,int>(data,data+n-1);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}//namespace
 | 
					}//namespace
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										9
									
								
								t.cc
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								t.cc
									
									
									
									
									
								
							@ -3176,12 +3176,19 @@ for(int l=1; l<k; ++l)
 | 
				
			|||||||
cout <<count<<" "<<binom(n,4)<<endl;
 | 
					cout <<count<<" "<<binom(n,4)<<endl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if(1)
 | 
					if(0)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
int d,n;
 | 
					int d,n;
 | 
				
			||||||
cin>>d>>n;
 | 
					cin>>d>>n;
 | 
				
			||||||
cout <<simplicial(d,n)<<" "<<binom(n+d-1,d)<<endl;
 | 
					cout <<simplicial(d,n)<<" "<<binom(n+d-1,d)<<endl;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(1)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					NRVec<int> d({6,2,1,4,3,5});
 | 
				
			||||||
 | 
					d.copyonwrite();
 | 
				
			||||||
 | 
					netsort(d.size(),&d[0]);
 | 
				
			||||||
 | 
					cout <<d;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user