void WSortView::FillData(unsigned int schema, size_t arraysize) { if (arraysize == 0) arraysize = 1; ResetArray(arraysize); if (schema == 0) // Shuffle of [1,n] { for (size_t i = 0; i < m_array.size(); ++i) m_array[i] = ArrayItem(i+1); std::random_shuffle(m_array.begin(), m_array.end()); } else if (schema == 1) // Ascending [1,n] { for (size_t i = 0; i < m_array.size(); ++i) m_array[i] = ArrayItem(i+1); } else if (schema == 2) // Descending [1,n] { for (size_t i = 0; i < m_array.size(); ++i) m_array[i] = ArrayItem(m_array.size() - i); } else if (schema == 3) // Cubic skew of [1,n] { for (size_t i = 0; i < m_array.size(); ++i) { // normalize to [-1,+1] double x = (2.0 * (double)i / m_array.size()) - 1.0; // calculate x^3 double v = x * x * x; // normalize to array size double w = (v + 1.0) / 2.0 * arraysize + 1; // decrease resolution for more equal values w /= 3.0; m_array[i] = ArrayItem(w + 1); } std::random_shuffle(m_array.begin(), m_array.end()); } else if (schema == 4) // Quintic skew of [1,n] { for (size_t i = 0; i < m_array.size(); ++i) { // normalize to [-1,+1] double x = (2.0 * (double)i / m_array.size()) - 1.0; // calculate x^5 double v = x * x * x * x * x; // normalize to array size double w = (v + 1.0) / 2.0 * arraysize + 1; // decrease resolution for more equal values w /= 3.0; m_array[i] = ArrayItem(w + 1); } std::random_shuffle(m_array.begin(), m_array.end()); } else if (schema == 5) // shuffled n-2 equal values in [1,n] { m_array[0] = ArrayItem(1); for (size_t i = 1; i < m_array.size()-1; ++i) { m_array[i] = ArrayItem( arraysize / 2 + 1 ); } m_array[m_array.size()-1] = ArrayItem(arraysize); std::random_shuffle(m_array.begin(), m_array.end()); } else if (schema == 6) // almost sorted values in [1,n] { for (size_t i = 0; i < m_array.size(); ++i) m_array[i] = ArrayItem(i+1); auto arraysize = m_array.size(); std::uniform_int_distribution<std::size_t> dist{0, arraysize}; std::random_device gen; std::size_t permutations = arraysize / 30; // magic numbers ftw! for(std::size_t i=0; i < permutations; ++i) std::swap(m_array[dist(gen)], m_array[dist(gen)]); } else // fallback { return FillData(0, arraysize); } FinishFill(); }
void WSortView::ResetArray(size_t size) { m_array.resize(size, ArrayItem(0)); m_mark.resize(size); }
void SortArray::FillData(unsigned int schema, size_t arraysize) { if (arraysize == 0) arraysize = 1; ResetArray(arraysize); if (schema == 0) // Shuffle of [1,n] { for (size_t i = 0; i < m_array.size(); ++i) m_array[i] = ArrayItem(i+1); std::random_shuffle(m_array.begin(), m_array.end()); } else if (schema == 1) // Ascending [1,n] { for (size_t i = 0; i < m_array.size(); ++i) m_array[i] = ArrayItem(i+1); } else if (schema == 2) // Descending [1,n] { for (size_t i = 0; i < m_array.size(); ++i) m_array[i] = ArrayItem(m_array.size() - i); } else if (schema == 3) // Cubic skew of [1,n] { for (size_t i = 0; i < m_array.size(); ++i) { // normalize to [-1,+1] double x = (2.0 * (double)i / m_array.size()) - 1.0; // calculate x^3 double v = x * x * x; // normalize to array size double w = (v + 1.0) / 2.0 * arraysize + 1; // decrease resolution for more equal values w /= 3.0; m_array[i] = ArrayItem(w + 1); } std::random_shuffle(m_array.begin(), m_array.end()); } else if (schema == 4) // Quintic skew of [1,n] { for (size_t i = 0; i < m_array.size(); ++i) { // normalize to [-1,+1] double x = (2.0 * (double)i / m_array.size()) - 1.0; // calculate x^5 double v = x * x * x * x * x; // normalize to array size double w = (v + 1.0) / 2.0 * arraysize + 1; // decrease resolution for more equal values w /= 3.0; m_array[i] = ArrayItem(w + 1); } std::random_shuffle(m_array.begin(), m_array.end()); } else if (schema == 5) // shuffled n-2 equal values in [1,n] { m_array[0] = ArrayItem(1); for (size_t i = 1; i < m_array.size()-1; ++i) { m_array[i] = ArrayItem( arraysize / 2 + 1 ); } m_array[m_array.size()-1] = ArrayItem(arraysize); std::random_shuffle(m_array.begin(), m_array.end()); } else // fallback { return FillData(0, arraysize); } FinishFill(); }