File indexing completed on 2024-04-14 05:43:08
0001 /* This file is part of the KDE project 0002 Copyright (C) 2000 David Faure <faure@kde.org> 0003 0004 This program is free software: you can redistribute it and/or modify 0005 it under the terms of the GNU General Public License as published by 0006 the Free Software Foundation, either version 2 of the License, or 0007 (at your option) any later version. 0008 0009 This program is distributed in the hope that it will be useful, 0010 but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0012 GNU General Public License for more details. 0013 0014 You should have received a copy of the GNU General Public License 0015 along with this program. If not, see <http://www.gnu.org/licenses/>. 0016 */ 0017 0018 #ifndef KINSERTIONSORT_P_H 0019 #define KINSERTIONSORT_P_H 0020 0021 /** 0022 * A template-based insertion sort algorithm, but not really 100% 0023 * generic. It is mostly written for lists, not for arrays. 0024 * 0025 * A good reason to use insertion sort over faster algorithms like 0026 * heap sort or quick sort, is that it minimizes the number of 0027 * movements of the items. This is important in applications which support 0028 * undo, because the number of commands is kept to a minimum. 0029 */ 0030 0031 // Item must define isNull(), previousSibling(), nextSibling() 0032 // SortHelper must define moveAfter( const Item &, const Item & ) 0033 // Criteria must define static Key key(const Item &) 0034 template<class Item, class Criteria, class Key, class SortHelper> 0035 inline void kInsertionSort(Item &firstChild, SortHelper &sortHelper) 0036 { 0037 if (firstChild.isNull()) 0038 return; 0039 Item j = firstChild.nextSibling(); 0040 while (!j.isNull()) { 0041 Key key = Criteria::key(j); 0042 // qCDebug(KEDITBOOKMARKS_LOG) << "Looking at j=" << key; 0043 // Insert A[j] into the sorted sequence A[1..j-1] 0044 Item i = j.previousSibling(); 0045 Item next = j.nextSibling(); 0046 bool moved = false; 0047 while (!i.isNull() && Criteria::key(i) > key) { 0048 i = i.previousSibling(); 0049 moved = true; 0050 } 0051 if (moved) { 0052 // qCDebug(KEDITBOOKMARKS_LOG) << "moveAfter(" << Criteria::key(j) << "," << (i.isNull() ? "null" : Criteria::key(i)) << ")"; 0053 sortHelper.moveAfter(j, i); // move j right after i. If i is null, move to first position. 0054 } 0055 j = next; 0056 // qCDebug(KEDITBOOKMARKS_LOG) << "Now j is" << Criteria::key(next); 0057 } 0058 } 0059 0060 #endif