#ifndef _NANXING_SORT_BASIC_H_ #define _NANXING_SORT_BASIC_H_ #include"nanxing_operator_check.h" #include"../nanxing_type_trait.h" #include #include #include namespace nanxing{ template class sort //这里的T类型必须是一个指针类型否则会报错 { public: static_assert(NANXING_BASIC_OPERATOR_(T,index),"It cannot be indexed"); //检查T类型能否下标访问 static_assert(NANXING_BASIC_OPERATOR_(T,compare_ptr),"The data pointed cannot compared"); //检查指向的数据能否比较大小 static_assert(NANXING_BASIC_OPERATOR_(T,equal_ptr),"The data pointed cannot assign value"); //检查指向的数据能否相互赋值 void operator()(T data,size_t size) //默认的sort用快速排序 { fast_sort(data,0,size-1); } static void fast_sort(T data,size_t left,size_t right) //快速排序 { if(right<=left) { return; } using ptr_type=nanxing::remove_pointer::type; ptr_type middle; //选取最后一个数字作为枢纽元(如果不是最后一个就将枢纽元和right元素交换) int i=left; int j=right-1; middle; if((right-left)<=3) //当划分的长度小于3的时候用直接插入排序 { for(int i=left+1;i<=right;i++) { for(int j=i;j>left;j--) { if(data[j]data[right]&&j>left){j--;} //注意书上的例程没有考虑一种非常特殊的情况即在ij同时等于枢纽元 if(i::type; ptr_type middle; for(int i=0;idata[j+1]) { middle =data[j+1]; data[j+1]=data[j]; data[j]=middle; } } } } static void strait_insert_sort(T data, size_t size) //直接插入排序 { using ptr_type=nanxing::remove_pointer::type; ptr_type middle; for(size_t i=1;i0;j--) { if(data[j]::type; ptr_type min; ptr_type middle; int n=0; for(int i=0;i::type; ptr_type middle; size_t middle_size=size; for(int i=static_cast(middle_size/2-1);i>=0;i--) //构建堆 { build_heap(data,i,size); } for(size_t i=size-1;i>0;i--) { middle=data[0]; data[0]=data[i]; data[i]=middle; build_heap(data,0,i); } } static void Hill_sort(T data,size_t jump,size_t size) //希尔排序 { using ptr_type=nanxing::remove_pointer::type; ptr_type middle; if(jump*2>=size-1) //如果跳跃的间隔过大就直接用直接插入排序 { strait_insert_sort(data,size); return; } for(int i=0;i=jump;k-=jump) { if(data[k]::type; ptr_type middle=data[S]; int middle_s=S; for(int j=2*middle_s+1;j<=(size-1);j=j*2+1) //这个是左孩子 { if(jdata[j]){ break; } else{ data[middle_s]=data[j]; middle_s=j; } } data[middle_s]=middle; } private: unsigned int amount; //T* sort_data_ptr; //指向需要排序的数据(一个数组或者一个vector之类的指针) //T& sort_data_ptr; //原始数据的引用 }; } #endif