int RandomizedSelect(std::vector<int> & nums, int start, int end, int i) { if (nums.empty()) return 0; if (start == end) return nums[start]; int mid = RandomizedPartition(nums, start, end); int k = mid - start + 1; if (i == k) return nums[mid]; else if (i < k) return RandomizedSelect(nums, start, mid - 1, i); else return RandomizedSelect(nums, mid + 1, end, i - k); }
int main() { int64_t array[] = { 2, 8, 7, 1, 3, 5, 6, 4 }; std::cout << RandomizedSelect(array, 0, 7, 3) << std::endl; getchar(); return 0; }
// ----------------------------------------------------------------------------- // Sort the entries of filtMagUpdateMap and set the threshold to be ? percentile // ----------------------------------------------------------------------------- Real_t BFReconstructionEngine::SetNonHomThreshold(RealImageType::Pointer magUpdateMap) { size_t dims[1] = { m_Geometry->N_z* m_Geometry->N_x}; RealArrayType::Pointer TempMagMap = RealArrayType::New(dims, "TempMagMap"); uint32_t ArrLength = m_Geometry->N_z * m_Geometry->N_x; Real_t threshold; //Copy into a new list for sorting Real_t* src = magUpdateMap->getPointer(); Real_t* dest = TempMagMap->getPointer(); ::memcpy(dest, src, ArrLength * sizeof(Real_t)); #ifdef DEBUG Real_t TempSum = 0; for(uint32_t i = 0; i < ArrLength; i++) { TempSum += TempMagMap->d[i]; } if(getVerbose()) { std::cout << "Temp mag map average= " << TempSum / ArrLength << std::endl; } #endif //DEBUG /* for (uint32_t i = 0; i < m_Geometry->N_z; i++) for (uint32_t j = 0; j < m_Geometry->N_x; j++) { //TempMagMap->d[i*geometry->N_x+j]=i*geometry->N_x+j; TempMagMap->d[i * (uint32_t)m_Geometry->N_x + j] = magUpdateMap->getValue(i, j); } */ uint32_t percentile_index = ArrLength / MBIR::Constants::k_NumNonHomogeniousIter; if(getVerbose()) { std::cout << "Percentile to select= " << percentile_index << std::endl; } //Partial selection sort /*Real_t max; uint32_t max_index; for (uint32_t i = 0; i <= percentile_index; i++) { max = TempMagMap->d[i]; max_index = i; for (uint32_t j = i + 1; j < ArrLength; j++) { if(TempMagMap->d[j] > max) { max = TempMagMap->d[j]; max_index = j; } } Real_t temp = TempMagMap->d[i]; TempMagMap->d[i] = TempMagMap->d[max_index]; TempMagMap->d[max_index] = temp; } threshold = TempMagMap->d[percentile_index];*/ threshold = RandomizedSelect(TempMagMap, 0, ArrLength - 1, ArrLength - percentile_index); return threshold; }
int64_t RandomizedSelect(int64_t* A, int64_t p, int64_t r, int64_t i) { if (p == r) { return A[p]; } int64_t q = RandomizedPartition(A, p, r); int64_t k = q - p + 1; if (i == k) { return A[q]; } else if (i < k) { return RandomizedSelect(A, p, q - 1, i); } else { return RandomizedSelect(A, q + 1, r, i - k); } }
int Find::RandomizedSelect(int a[], int p, int r, int pos) { //if p == r, the pos = 1 if (p == r) { return a[p]; } int q = Common::RandParition(a, p, r); //min array size int k = q - p + 1; if (pos == k) { return a[q]; } else if (pos < k) { return RandomizedSelect(a, p, q - 1, pos); } else { return RandomizedSelect(a, q + 1, r, pos - k); } }