+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt3Support module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef Q3TL_H
-#define Q3TL_H
-
-#include <QtCore/qalgorithms.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Qt3SupportLight)
-
-template <typename T, typename LessThan>
-Q_OUTOFLINE_TEMPLATE void qHeapSortPushDown(T *heap, int first, int last, LessThan lessThan)
-{
- int r = first;
- while (r <= last / 2) {
- if (last == 2 * r) {
- // node r has only one child
- if (lessThan(heap[2 * r], heap[r]))
- qSwap(heap[r], heap[2 * r]);
- r = last;
- } else {
- // node r has two children
- if (lessThan(heap[2 * r], heap[r]) && !lessThan(heap[2 * r + 1], heap[2 * r])) {
- // swap with left child
- qSwap(heap[r], heap[2 * r]);
- r *= 2;
- } else if (lessThan(heap[2 * r + 1], heap[r])
- && lessThan(heap[2 * r + 1], heap[2 * r])) {
- // swap with right child
- qSwap(heap[r], heap[2 * r + 1]);
- r = 2 * r + 1;
- } else {
- r = last;
- }
- }
- }
-}
-
-template <typename BiIterator, typename T, typename LessThan>
-Q_OUTOFLINE_TEMPLATE void qHeapSortHelper(BiIterator begin, BiIterator end, const T & /* dummy */, LessThan lessThan)
-{
- BiIterator it = begin;
- uint n = 0;
- while (it != end) {
- ++n;
- ++it;
- }
- if (n == 0)
- return;
-
- // Create the heap
- BiIterator insert = begin;
- T *realheap = new T[n];
- T *heap = realheap - 1;
- int size = 0;
- for(; insert != end; ++insert) {
- heap[++size] = *insert;
- int i = size;
- while (i > 1 && lessThan(heap[i], heap[i / 2])) {
- qSwap(heap[i], heap[i / 2]);
- i /= 2;
- }
- }
-
- // Now do the sorting
- for (int i = n; i > 0; i--) {
- *begin++ = heap[1];
- if (i > 1) {
- heap[1] = heap[i];
- qHeapSortPushDown(heap, 1, i - 1, lessThan);
- }
- }
-
- delete[] realheap;
-}
-
-template <typename BiIterator, typename T>
-inline void qHeapSortHelper(BiIterator begin, BiIterator end, const T &dummy)
-{
- qHeapSortHelper(begin, end, dummy, qLess<T>());
-}
-
-template <typename BiIterator, typename LessThan>
-inline void qHeapSort(BiIterator begin, BiIterator end, LessThan lessThan)
-{
- if (begin != end)
- qHeapSortHelper(begin, end, *begin, lessThan);
-}
-
-template <typename BiIterator>
-inline void qHeapSort(BiIterator begin, BiIterator end)
-{
- if (begin != end)
- qHeapSortHelper(begin, end, *begin);
-}
-
-template <typename Container>
-inline void qHeapSort(Container &c)
-{
-#ifdef Q_CC_BOR
- // Work around Borland 5.5 optimizer bug
- c.detach();
-#endif
- if (!c.empty())
- qHeapSortHelper(c.begin(), c.end(), *c.begin());
-}
-
-
-template <typename BiIterator, typename LessThan>
-void qBubbleSort(BiIterator begin, BiIterator end, LessThan lessThan)
-{
- // Goto last element;
- BiIterator last = end;
-
- // empty list
- if (begin == end)
- return;
-
- --last;
- // only one element ?
- if (last == begin)
- return;
-
- // So we have at least two elements in here
- while (begin != last) {
- bool swapped = false;
- BiIterator swapPos = begin;
- BiIterator x = end;
- BiIterator y = x;
- y--;
- do {
- --x;
- --y;
- if (lessThan(*x, *y)) {
- swapped = true;
- qSwap(*x, *y);
- swapPos = y;
- }
- } while (y != begin);
- if (!swapped)
- return;
- begin = swapPos;
- ++begin;
- }
-}
-
-template <typename BiIterator, typename T>
-void qBubbleSortHelper(BiIterator begin, BiIterator end, T)
-{
- qBubbleSort(begin, end, qLess<T>());
-}
-
-template <typename BiIterator>
-void qBubbleSort(BiIterator begin, BiIterator end)
-{
- if (begin != end)
- qBubbleSortHelper(begin, end, *begin);
-}
-
-template <typename Container>
-inline void qBubbleSort(Container &c)
-{
- qBubbleSort(c.begin(), c.end());
-}
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif // Q3TL_H
#include <sstream>
#include <algorithm>
#include <qalgorithms.h>
-#include "q3tl.h"
#include <QStringList>
#include <QString>
#include <QVector>
void cleanup();
private slots:
- void qBubbleSort();
- void qHeapSort();
void test_qLowerBound_data();
void test_qLowerBound();
void test_qUpperBound_data();
};
tst_QAlgorithms::tst_QAlgorithms()
-
{
}
tst_QAlgorithms::~tst_QAlgorithms()
{
-
}
void tst_QAlgorithms::init()
}
}
#endif
-static bool userFunction1(char ch1, char ch2)
-{
- return (ch1 ^ 1) < (ch2 ^ 1);
-}
-
-bool userFunction2(const char &ch1, char ch2)
-{
- return (ch1 ^ 1) < (ch2 ^ 1);
-}
-
-static inline bool userFunction3(char ch1, const char &ch2)
-{
- return (ch1 ^ 1) < (ch2 ^ 1);
-}
-
-inline bool userFunction4(const char &ch1, const char &ch2)
-{
- return (ch1 ^ 1) < (ch2 ^ 1);
-}
-
-class UserFunctor1
-{
-public:
- UserFunctor1(int x = 1) : y(x) {}
-
- bool operator()(char ch1, char ch2)
- {
- return (ch1 ^ y) < (ch2 ^ y);
- }
-
- char y;
-};
-
-void tst_QAlgorithms::qHeapSort()
-{
- char array1[] = "3141592";
- ::qHeapSort((char *)array1, array1 + strlen(array1));
- QVERIFY(strcmp(array1, "1123459") == 0);
-
- ::qHeapSort((char *)array1, array1 + strlen(array1), qGreater<char>());
- QVERIFY(strcmp(array1, "9543211") == 0);
-
- ::qHeapSort((char *)array1, array1 + strlen(array1), qLess<char>());
- QVERIFY(strcmp(array1, "1123459") == 0);
- {
- char array2[] = "0123456789@ABCDE";
- ::qHeapSort((char *)array2, array2 + strlen(array2), userFunction1);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qHeapSort((char *)array2, array2 + strlen(array2), userFunction2);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qHeapSort((char *)array2, array2 + strlen(array2), userFunction3);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qHeapSort((char *)array2, array2 + strlen(array2), userFunction4);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- UserFunctor1 userFunctor1;
- char array2[] = "0123456789@ABCDE";
- ::qHeapSort((char *)array2, array2 + strlen(array2), userFunctor1);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qHeapSort((char *)array2, array2 + strlen(array2), UserFunctor1());
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- ::qHeapSort((char *)array2, array2 + strlen(array2), UserFunctor1(1));
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- ::qHeapSort((char *)array2, array2 + strlen(array2), UserFunctor1(3));
- QVERIFY(strcmp(array2, "3210765498CBA@ED") == 0);
- ::qHeapSort((char *)array2, array2 + strlen(array2), UserFunctor1(0));
- QVERIFY(strcmp(array2, "0123456789@ABCDE") == 0);
- }
-}
-
-void tst_QAlgorithms::qBubbleSort()
-{
- char array1[] = "3141592";
- ::qBubbleSort((char *)array1, array1 + strlen(array1));
- QVERIFY(strcmp(array1, "1123459") == 0);
-
- ::qBubbleSort((char *)array1, array1 + strlen(array1), qGreater<char>());
- QVERIFY(strcmp(array1, "9543211") == 0);
-
- ::qBubbleSort((char *)array1, array1 + strlen(array1), qLess<char>());
- QVERIFY(strcmp(array1, "1123459") == 0);
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qBubbleSort((char *)array2, array2 + strlen(array2), userFunction1);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qBubbleSort((char *)array2, array2 + strlen(array2), userFunction2);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qBubbleSort((char *)array2, array2 + strlen(array2), userFunction3);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qBubbleSort((char *)array2, array2 + strlen(array2), userFunction4);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- UserFunctor1 userFunctor1;
- char array2[] = "0123456789@ABCDE";
- ::qBubbleSort((char *)array2, array2 + strlen(array2), userFunctor1);
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- }
-
- {
- char array2[] = "0123456789@ABCDE";
- ::qBubbleSort((char *)array2, array2 + strlen(array2), UserFunctor1());
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- ::qBubbleSort((char *)array2, array2 + strlen(array2), UserFunctor1(1));
- QVERIFY(strcmp(array2, "1032547698A@CBED") == 0);
- ::qBubbleSort((char *)array2, array2 + strlen(array2), UserFunctor1(3));
- QVERIFY(strcmp(array2, "3210765498CBA@ED") == 0);
- ::qBubbleSort((char *)array2, array2 + strlen(array2), UserFunctor1(0));
- QVERIFY(strcmp(array2, "0123456789@ABCDE") == 0);
- }
-}
void tst_QAlgorithms::swap()
{
QList<int> list;
list << 4 << 3 << 6;
- ::qHeapSort(list.begin(), list.end());
+ ::qSort(list.begin(), list.end());
QCOMPARE(list.count(), 3);
QCOMPARE(list.at(0), 3);
}
template <typename DataType>
-class HeapSortHelper
-{
-public:
- void operator()(QVector<DataType> list)
- {
- ::qHeapSort(list);
- }
-};
-
-template <typename DataType>
-class BubbleSortHelper
-{
-public:
- void operator()(QVector<DataType> list)
- {
- ::qBubbleSort(list);
- }
-};
-
-template <typename DataType>
class QuickSortHelper
{
public:
testAlgorithm<StlSortHelper<TestInt>, TestInt>(StlSortHelper<TestInt>(), dataSetTypes);
cout << endl << "std::stable_sort" << endl;
testAlgorithm<StlStableSortHelper<TestInt>, TestInt>(StlStableSortHelper<TestInt>(), dataSetTypes);
- cout << "Heap sort" << endl;
- testAlgorithm<HeapSortHelper<TestInt>, TestInt>(HeapSortHelper<TestInt>(), dataSetTypes);
- cout << endl << "Bubble sort" << endl;
- testAlgorithm<BubbleSortHelper<TestInt>, TestInt>(BubbleSortHelper<TestInt>(), dataSetTypes);
/*
cout << endl << "Sorting lists of ints" << endl;
- cout << "Heap sort" << endl;
- testAlgorithm<HeapSortHelper<int>, int>(HeapSortHelper<int>(), dataSetTypes);
cout << endl << "Quick sort" << endl;
testAlgorithm<QuickSortHelper<int>, int>(QuickSortHelper<int>(), dataSetTypes);
cout << endl << "std::sort" << endl;
testAlgorithm<StlSortHelper<int>, int>(StlSortHelper<int>(), dataSetTypes);
cout << endl << "std::stable_sort" << endl;
testAlgorithm<StlStableSortHelper<int>, int>(StlStableSortHelper<int>(), dataSetTypes);
- cout << endl << "Bubble sort" << endl;
- testAlgorithm<BubbleSortHelper<int>, int>(BubbleSortHelper<int>(), dataSetTypes);
*/
}
#endif