alpar@465: /* -*- mode: C++; indent-tabs-mode: nil; -*- deba@464: * alpar@465: * This file is a part of LEMON, a generic C++ optimization library. deba@464: * alpar@467: * Copyright (C) 2003-2009 deba@464: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport deba@464: * (Egervary Research Group on Combinatorial Optimization, EGRES). deba@464: * deba@464: * Permission to use, modify and distribute this software is granted deba@464: * provided that this copyright notice appears in all copies. For deba@464: * precise terms see the accompanying LICENSE file. deba@464: * deba@464: * This software is provided "AS IS" with no warranty of any kind, deba@464: * express or implied, and with no claim as to its suitability for any deba@464: * purpose. deba@464: * deba@464: */ deba@464: deba@464: #include deba@464: #include deba@464: #include deba@464: #include deba@464: #include deba@464: deba@464: #include "test_tools.h" deba@464: deba@464: #include deba@464: #include deba@464: deba@464: using namespace lemon; deba@464: deba@464: static const int n = 10000; deba@464: deba@464: struct Negate { deba@464: typedef int argument_type; deba@464: typedef int result_type; deba@464: int operator()(int a) { return - a; } deba@464: }; deba@464: deba@464: int negate(int a) { return - a; } deba@464: deba@464: deba@464: void generateIntSequence(int n, std::vector& data) { deba@464: int prime = 9973; deba@464: int root = 136, value = 1; deba@464: for (int i = 0; i < n; ++i) { deba@464: data.push_back(value - prime / 2); deba@464: value = (value * root) % prime; deba@464: } deba@464: } deba@464: deba@464: void generateCharSequence(int n, std::vector& data) { deba@464: int prime = 251; deba@464: int root = 3, value = root; deba@464: for (int i = 0; i < n; ++i) { deba@464: data.push_back(static_cast(value)); deba@464: value = (value * root) % prime; deba@464: } deba@464: } deba@464: deba@464: void checkRadixSort() { deba@464: { deba@464: std::vector data1; deba@464: generateIntSequence(n, data1); deba@464: deba@464: std::vector data2(data1); deba@464: std::sort(data1.begin(), data1.end()); deba@464: deba@464: radixSort(data2.begin(), data2.end()); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[i], "Test failed"); deba@464: } deba@464: deba@464: radixSort(data2.begin(), data2.end(), Negate()); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[n - 1 - i], "Test failed"); deba@464: } deba@464: deba@464: radixSort(data2.begin(), data2.end(), negate); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[n - 1 - i], "Test failed"); deba@464: } deba@464: alpar@465: } alpar@465: deba@464: { deba@464: std::vector data1(n); deba@464: generateCharSequence(n, data1); deba@464: deba@464: std::vector data2(data1); deba@464: std::sort(data1.begin(), data1.end()); deba@464: deba@464: radixSort(data2.begin(), data2.end()); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[i], "Test failed"); deba@464: } deba@464: deba@464: } deba@464: } deba@464: deba@464: deba@466: void checkStableRadixSort() { deba@464: { deba@464: std::vector data1; deba@464: generateIntSequence(n, data1); deba@464: deba@464: std::vector data2(data1); deba@464: std::sort(data1.begin(), data1.end()); deba@464: deba@466: stableRadixSort(data2.begin(), data2.end()); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[i], "Test failed"); deba@464: } deba@464: deba@466: stableRadixSort(data2.begin(), data2.end(), Negate()); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[n - 1 - i], "Test failed"); deba@464: } deba@464: deba@466: stableRadixSort(data2.begin(), data2.end(), negate); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[n - 1 - i], "Test failed"); deba@464: } alpar@465: } deba@464: deba@464: { deba@464: std::vector data1(n); deba@464: generateCharSequence(n, data1); deba@464: deba@464: std::vector data2(data1); deba@464: std::sort(data1.begin(), data1.end()); deba@464: deba@464: radixSort(data2.begin(), data2.end()); deba@464: for (int i = 0; i < n; ++i) { deba@464: check(data1[i] == data2[i], "Test failed"); deba@464: } deba@464: deba@464: } deba@464: } deba@464: deba@464: int main() { deba@464: alpar@465: checkRadixSort(); deba@466: checkStableRadixSort(); deba@464: deba@464: return 0; deba@464: }