// 改进版快速排序,三数中值分割选取枢纽元 // 此方法来自DSAAC static void qsort3(int data[], int left, int right) { if (left < right) { int i = partition3(data, left, right); qsort3(data, left, i - 1); qsort3(data, i + 1, right); } }
static bool test_sequence(Test t) { bool rc = true; size_t n = t.size; Colour *a = t.data; Colour *d = dup_sequence(n, a); if (verbose) dump_colours("Before", a, n); partition3(n, d); if (verbose) dump_colours("After ", d, n); if (is_invalid_sequence(n, d, false)) { if (!verbose) dump_colours("Before", a, n); is_invalid_sequence(n, d, true); if (!verbose) dump_colours("After ", d, n); if (wflag) write_sequence(++seqno, n, a); rc = false; } free(d); return rc; }
void quicksort3( const IT1& first1, const IT1& last1, const IT2& first2, const IT2& last2, const IT3& first3, const IT3& last3) { typedef typename std::iterator_traits<IT1>::difference_type DT; DT DT1 = OrdinalTraits<DT>::one(); if(last1-first1 > DT1) { IT1 pivot = getPivot(first1, last1); pivot = partition3(first1, last1, first2, last2, first3, last3, pivot); quicksort3(first1, pivot, first2, first2+(pivot-first1), first3, first3+(pivot-first1)); quicksort3(pivot+1, last1, first2+(pivot-first1)+1, last2, first3+(pivot-first1)+1, last3); } }
void peano::kernel::regulargrid::parallel::tests::SetupPartitionerTest::test2D_12x8() { #ifdef Dim2 tarch::la::Vector<DIMENSIONS,int> domain; assignList(domain) = 12,9; peano::kernel::regulargrid::parallel::SetupPartitioner partition0(domain,8); peano::kernel::regulargrid::parallel::SetupPartitioner partition1(domain,9); peano::kernel::regulargrid::parallel::SetupPartitioner partition2(domain,10); peano::kernel::regulargrid::parallel::SetupPartitioner partition3(domain,11); validateEquals( partition0.getParallelTopology()(0), 4 ); validateEquals( partition0.getParallelTopology()(1), 2 ); validateEquals( partition1.getParallelTopology()(0), 3 ); validateEquals( partition1.getParallelTopology()(1), 3 ); validateEquals( partition2.getParallelTopology()(0), 3 ); validateEquals( partition2.getParallelTopology()(1), 3 ); validateEquals( partition3.getParallelTopology()(0), 3 ); validateEquals( partition3.getParallelTopology()(1), 3 ); tarch::la::Vector<DIMENSIONS,int> expectedSize; tarch::la::Vector<DIMENSIONS,int> expectedOffset; tarch::la::Vector<DIMENSIONS,int> subdomain; assignList(expectedSize) = 4,3; assignList(subdomain) = 0,0; assignList(expectedOffset) = 0,0; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 1,0; assignList(expectedOffset) = 4,0; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 2,0; assignList(expectedSize) = 3,3; assignList(expectedOffset) = 8,0; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 0,1; assignList(expectedSize) = 4,3; assignList(expectedOffset) = 0,3; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 1,1; assignList(expectedOffset) = 4,3; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 2,1; assignList(expectedSize) = 3,3; assignList(expectedOffset) = 8,3; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 0,2; assignList(expectedSize) = 4,2; assignList(expectedOffset) = 0,6; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 1,2; assignList(expectedSize) = 4,2; assignList(expectedOffset) = 4,6; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); assignList(subdomain) = 2,2; assignList(expectedSize) = 3,2; assignList(expectedOffset) = 8,6; validateEquals( partition1.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition2.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition3.getSizeOfPartition(subdomain), expectedSize ); validateEquals( partition1.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition2.getOffsetOfPartition(subdomain), expectedOffset ); validateEquals( partition3.getOffsetOfPartition(subdomain), expectedOffset ); #endif }