ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Сортування даних в масиві
         

     

    Інформатика, програмування

    Сортування даних у масиві

    У цьому розділі буде розглянуто знаменитий алгоритм''швидкої''сортування, що по праву вважається найшвидшим серед неспеціалізованих алгоритмів сортування. Для порівняння ми також розглянемо один з алгоритмів сортування, що мають більш низьку ефективність, але й більш простих алгоритмів - сортування вставками.

    Сортування вставками

    Сортування вставками схожа на процес тасування карток з іменами. Реєстратор заносить кожне ім'я на картку, а потім впорядковує картки за алфавітом, вставляючи картку у верхню частину стопки у підходяще місце. Опишемо цей процес на прикладі нашого пятіелементного списку A = 50, 20, 40, 75, 35 (малюнок 1).

    У функцію InsertionSort передається масив A і довжина списку n. Розглянемо i-ий прохід (1

    Рис. 1        

    // Сортування вставками   впорядковує підсписки A [0] ... A [i], 1 <= i <= n-1. Для   

    // кожного i A [i]   вставляється у відповідну позицію A [j]   

    template   

    void InsertionSort (T A [], int n)   

    (   

    int i, j;   

    T temp;      

    // i визначає подспісок A [0] ... A [i]   

    for (i = 1; i   

    (   

    // індекс j пробігає вниз за списком від   A [i] в процесі   

    //   пошуку правильної позиції вставляється значення   

    j = i;   

    temp = A [i];   

    // виявити відповідну позицію для   вставки, скануючи подспісок,   

    // поки temp   

    while (j> 0 & & temp   

    (   

    // зрушити елементи вправо, щоб   звільнити місце для вставки   

    A [j] = A [j-1];   

    j -;   

    )   

    // точка вставки знайдена; вставити temp   

    A [j] = temp;   

    )   

    )     

    Обчислювальна ефективність сортування вставками

    Сортування вставками вимагає фіксованого числа проходів. На n-1 проходах вставляються елементи від A [1] до A [n-1]. На i-му проході вставки виробляються в подспісок A [0]-A [i] і вимагають в середньому i/2 порівнянь. Загальне число порівнянь одно        

    1/2 + 2/2 + 3/2 + ... + (N-2)/2 +   (n-1)/2 = n (n-1)/4     

    На відміну від інших методів, сортування вставками не використовує обміни. Складність алгоритму вимірюється кількістю порівнянь і дорівнює O (n2). Найкращий випадок - коли початковий список вже відсортований. Тоді на i-му проході вставка здійснюється в точці A [i], а загальне число порівнянь одно n-1, тобто складність становить O (n). Найгірший випадок виникає, коли список відсортований за спаданням. Тоді кожна вставка відбувається в точці A [0] і вимагає i порівнянь. Загальне число порівнянь одно n (n-1)/2, тобто складність становить O (n2).

    В принципі, алгоритм сортування вставками можна значно прискорити. Для цього слід не зрушувати елементи по одному, як це продемонстровано в наведеному вище прикладі, а знаходити потрібний елемент з допомогою бінарного пошуку, описаного в попередньому номері (тобто, в циклі розбиваючи список на дві рівні частини, поки що в списку не залишиться один-два елементу), а для сдвіжкі використовувати функції копіювання пам'яті. Такий підхід дає досить високу продуктивність на невеликих масивах. Основним вузьким місцем у даному випадку є саме копіювання пам'яті. Поки що обсяг копійованих даних (близько половини розміру масиву) можна порівняти з розміром кеша процесора 1 рівня, продуктивність цього методу досить висока. Але з-за множинних непродуктивних повторів копіювання, цей спосіб менш привабливий, ніж метод «швидкої» сортування, описаний у наступному розділі. Цей же метод можна рекомендувати у разі щодо статичного масиву, в який зрідка проводиться вставка одного-двох елементів.

    «Швидка» сортування

    Отже, ми розглянули алгоритм сортування масиву, що має складність порядку O (n2). Алгоритми, що використовують дерева (турнірна сортування, сортування за допомогою пошукового дерева), забезпечують значно кращу продуктивність O (n log2n). Незважаючи на те, що вони вимагають копіювання масиву в дерево і назад, ці витрати покриваються за рахунок більшої ефективності самої сортування.

    Широко використовується метод пірамідальною сортування також обробляє масив «на місці» і має ефективність O (n log2n). Однак «Швидка» сортування, яку винайшов К. Хоар, для більшості програм перевершує пірамідальну сортування і є найшвидшою з відомих до сих пір.

    Опис «швидкої» сортування

    Як і для більшості алгоритмів сортування, методика «Швидкої» сортування взята з повсякденного досвіду. Щоб відсортувати більшу стопку алфавітних карток по іменах, можна розбити її на два менші стопки щодо якої-небудь літери, наприклад K. Всі імена, менші або рівні K, йдуть в одну стопку, а інші - в іншу.

    Рис.2

    Потім кожна стопка знову ділиться на два. Наприклад, на малюнку 2 точками розбиття є букви F і R. Процес розбиття на все менші й менші стопки триває.

    В алгоритмі «швидкої» сортування застосовується метод розбиття з визначенням центрального елемента. Так як ми не можемо дозволити собі задоволення розкидати стопки по всьому столі, як під час сортування алфавітних карток, елементи розбиваються на групи всередині масиву. Розглянемо алгоритм «швидкої» сортування на прикладі, а потім обговоримо технічні деталі. Нехай дано масив, що складається з 10 цілих чисел:        

    A = 800, 150, 300, 600, 550, 650, 400,   350, 450, 700     

    Фаза сканування

    Масив має нижню межу, що дорівнює 0 (low), і верхню кордон, що дорівнює 9 (high). Його середина доводиться на 4 елемент (mid). Першим центральним елементом є A [mid] = 550. Таким чином, всі елементи масиву A розбиваються на дві підсписки: Sl і Sh. Менший з них (Sl) буде містити елементи, менші або рівні центральному. Подспісок Sh буде містити елементи більші, ніж центральний. Оскільки заздалегідь відомо, що центральний елемент в кінцевому підсумку буде останнім у підсписки Sl, ми тимчасово пересуваємо його в початок масиву, міняючи місцями з A [0] (A [low]). Це дозволяє сканувати подспісок A [1] - A [9] за допомогою двох індексів: scanUp і scanDown. Початкове значення scanUp відповідає індексу 1 (low +1). Ця мінлива адресує елементи підсписки Sl. Змінна scanDown адресує елементи підсписки Sh і має початкове значення 9 (high). Метою проходу є визначення елементів для кожного підсписки.

    Рис.3

    Оригінальність «швидкої» сортування полягає у взаємодію двох індексів у процесі сканування списку. Індекс scanUp переміщується вгору за списком, а scanDown - вниз. Ми просуваємо scanUp вперед і шукаємо елемент A [scanUp] більший, ніж центральний. У цьому місці сканування зупиняється, і ми готуємося перемістити знайдений елемент у верхній подспісок. Перед тим, як це переміщення відбудеться, ми просуваємо індекс scanDown вниз по списку і знаходимо елемент, менший або рівний центральному. Таким чином, у нас є два елементи, які знаходяться не в тих підсписки, і їх можна міняти місцями.        

    Swap (A [scanUp], A [scanDown]);//   міняти місцями партнерів     

    Цей процес продовжується до тих пір, поки scanUp і scanDown не зайдуть один за одного (scanUp = 6, scanDown = 5). У цей момент scanDown виявляється в підсписки, елементи якого менше або дорівнювати центральному. Ми потрапили в точку розбиття двох списків і вказали остаточну позицію для центрального елемента. У нашому прикладі помінялися місцями числа 600 та 450, 800 і 350, 650 і 400 (див. малюнок 4).

    Рис.4

    Потім відбувається обмін значеннями центрального елемента A [0] з A [scanDown]:        

    Swap (A [0], A [scanDown ]);     

    У результаті у нас з'являються дві підсписки A [0] -- A [5] і A [6] - A [9], причому всі елементи перших підсписки менше елементів другий, і останній елемент першого підсписки є його найбільшим елементом. Таким чином, можна вважати, що після зроблених операцій підсписки розділені елементом А [5] = 550 (малюнок 5). Якщо тепер відсортувати подспісок кожен окремо, то в нас вийде повністю відсортований масив. Зауважте, що по суті обидва цих підсписки є такими ж масивами, як це було зроблено, тому до них можна застосувати той же самий алгоритм. Застосування того ж алгоритму до частин масиву називається рекурсивної фазою.

    рекурсивна фаза

    Одним і тим же методом обробляються два підсписки: Sl (A [0] - A [4]) і Sh (A [6] - A [9]). Елемент А [5] обробляти не треба, тому що він вже знаходиться на своєму місці.

    Той же алгоритм застосовується для кожного підсписки, розбиваючи ці підсписки на менші частини, поки в підсписки не залишиться одного елемента або поки подспісок не опустіє.

    Рис.5

    Алгоритм QuickSort

    Цей рекурсивний алгоритм поділяє список A [low] - A [high] по центральному елементу, який вибирається з середини списку        

    mid   = (High + low)/2;   

    pivot   = A [mid];     

    Після обміну місцями центрального елемента з A [low], задаються початкові значення індексів scanUp = low + 1 і scanDown = high, що вказує на початок і кінець списку, відповідно. Алгоритм управляє цими двома індексами. Спочатку scanUp просувається вгору за списком, поки не перевищить значення scanDown або поки не зустрінеться елемент більший, ніж центральний.        

    while   (scanUp <= scanDown & & A [scanUp] <= pivot)   

    scanUp ++;     

    Після позиціонування scanUp індекс scanDown просувається вниз по списку, поки не зустрінеться елемент, менший або рівний центральному.        

    while   (pivot   

    scanDown -;     

    Після закінчення цього циклу (і за умови, що scanUp        

    Swap (A [scanUp],   A [scanDown ]);     

    Обмін елементів припиняється, коли scanDown стає менше, ніж scanUp. У цей момент scanDown вказує початок лівого підсписки, який містить менші або рівні центральному елементи. Індекс scanDown стає центральним. Взяти центральний елемент з A [low]:        

    Swap (A [low],   A [scanDown ]);     

    Для обробки підсписки використовується рекурсія. Після виявлення точки розбиття ми рекурсивно викликаємо QuickSort з параметрами low, mid-1 і mid +1, high. Умова зупину виникає, коли в підсписки залишається менше двох елементів, так як одноелементні або порожній масив впорядковувати НЕ потрібно.        

    // Swap міняє місцями   елементи масиву. Відповідний тип даних   

    // повинен підтримувати   операцію «=».   

    template   

    void Swap (T & el1, T & el2)   

    (   

    T tmp = el1;   

    el1 = el2;   

    el2 = tmp;   

    )      

    // QuickSort приймає в   Як параметри масив   

    // і граничні значення   його індексів   

    template   

    void QuickSort (T A [], int low, int high)   

    (   

    // локальні змінні, що містять індекс   середини - mid,   

    // центральний елемент та індекси   сканування   

    T pivot;   

    int scanUp, scanDown;   

    int mid;      

    // якщо діапазон індексів не включає в себе   

    // як мінімум два елементи, завершити   роботу   

    if (high - low <= 0)   

    return;   

    else if (high - low == 1)   

    (   

    // якщо в підсписки два елементи,   порівняти їх між собою   

    // і поміняти місцями при необхідності   

    if (A [high]   

    Swap (A [low], A [high ]);   

    return;   

    )      

    // Розрахувати індекс середини і помістити   значення відповідного   

    // елементу масиву в змінну pivot.   

    mid = (low + high)/2;   

    pivot = A [mid];      

    // Поміняти місцями центральний і початковий елементи списку.   

    Swap (A [mid], A [low ]);   

    // ініціалізувати індекси scanUp і scanDown.   

    scanUp = low + 1;   

    scanDown = high;      

    // Шукати елементи, розташовані не в тих   підсписки.   

    // Зупинитися при scanDown   

    do   

    (   

    // Просуватися вгору по першій   підсписки. Зупинитися,   

    // коли scanUp вкаже на другий   подспісок або якщо   

    // вказуваний цим індексом елемент>   центрального.   

    while (scanUp <= scanDown & &   A [scanUp] <= pivot)   

    scanUp ++;      

    // Просуватися вниз по другому   підсписки. Зупинитися,   

    // коли scanDown указжет на елемент   > = Центральному.   

    while (A [scanDown]> pivot)   

    scanDown -;      

    // Якщо індекси все ще у своїх підсписки, то вони   вказують   

    // на два елементи, що знаходяться не в тих   підсписки.   

    if (scanUp   

    (   

    // Поміняти їх місцями   

    Swap (A [scanUp],   A [scanDown ]);   

    )   

    )   

    while (scanUp      

    // Копіювати елемент на який вказує   точка розбиття   

    // в перший елемент підсписки перше, ...   

    A [low] = A [scanDown];   

    // а центральний елемент в точку розбиття   

    A [scanDown] = pivot;      

    // якщо перше подспісок (low. .. scanDown-1)   має 2 або більше   

    // елементу, виконати для нього рекурсивний   виклик QuickSort   

    if (low   

    QuickSort (A, low,   scanDown-1);      

    // якщо друга подспісок (scanDown +1 ... high) має 2 або більше   

    // елементу, виконати для нього рекурсивний   виклик QuickSort   

    if (scanDown 1   

    QuickSort (A, scanDown 1,   high);   

    )     

    Обчислювальна складність «швидкої» сортування

    Загальний аналіз ефективності «швидкої» сортування досить важкий. Буде краще показати її обчислювальну складність, підрахувавши число порівнянь при деяких ідеальних припущеннях. Припустимо, що n - ступінь двійки, n = 2k (k = log2n), а центральний елемент розташовується точно посередині кожного списку і розбиває його на два підсписки приблизно однаковою довжини.

    При першому скануванні проводиться n-1 порівнянь. У результаті створюються два підсписки розміром n/2. На наступній фазі обробка кожного підсписки вимагає приблизно n/2 порівнянь. Загальне число порівнянь на цій фазі дорівнює 2 (n/2) = n. На наступній фазі обробляються чотири підсписки, що вимагає 4 (n/4) порівнянь, і т.д. Врешті-решт процес розбиття припиняється після k проходів, коли вийшли підсписки містять по одному елементу. Загальне число порівнянь приблизно дорівнює        

    n +   2 (n/2) + 4 (n/4) + ... + N (n/n) = n + n + ... + N = n * k = n * log2n     

    Для списку загального вигляду обчислювальна складність «Швидкої» сортування дорівнює O (n log2 n). Ідеальний випадок, який ми тільки що розглянули, фактично виникає тоді, коли масив вже відсортований за зростанням. Тоді центральний елемент потрапляє точно в середину кожного підсписки.

    Якщо масив відсортований за спаданням, то на перший проході центральний елемент виявляється на середині списку і змінюється місцями з кожним елементом як у першому, так і в другому підсписки. Результуючий список майже відсортований, алгоритм має складність порядку O (n log2n).

    Рис.6

    Найгіршим сценарієм для «швидкої» сортування буде той, при якому центральний елемент весь час потрапляє в одноелементні подспісок, а всі інші елементи залишаються в другому підсписки. Це відбувається тоді, коли центральним завжди є найменший елемент. Розглянемо послідовність 3, 8, 1, 5, 9.

    На першому проході проводиться n порівнянь, а більший подспісок містить n-1 елементів. На наступному проході цей подспісок вимагає n-1 порівнянь і дає подспісок з n-2 елементів і т.д. Загальне число порівнянь одно:        

    n + n-1 + n-2 + ... + 2 = n (n +1)/2 - 1     

    Складність найгіршого випадку дорівнює O (n2), тобто не краще, ніж для сортувань вставками і вибором. Проте цей випадок є патологічним і малоймовірний на практиці. Загалом, середня продуктивність «Швидкої» сортування вище, ніж у всіх розглянутих нами сортувань.

    Алгоритм QuickSort вибирається за основу в більшості універсальних сортують утиліт. Якщо ви не можете змиритися з продуктивністю найгіршого випадку, використовуйте пірамідальну сортування -- більш стійкий алгоритм, складність якого дорівнює O (n log2n) і залежить тільки від розміру списку.

    Порівняння алгоритмів сортування масивів

    Ми порівняли алгоритми сортування, випробувавши їх на масивах, що містять 4000, 8000, 10000, 15000 і 20000 цілих чисел, відповідно. Час виконання виміряна в тіках (1/60 частка секунди). Серед всіхалгоритмів порядку O (n2) час сортування вставками відображає той факт, що на i-му проході потрібно лише i/2 порівнянь. Цей алгоритм явно перевершує всі інші сортування порядку O (n2). Зауважте, що найгіршу загальну продуктивність демонструє сортування методом бульбашки. Результати випробувань показані в таблиці 1 і на малюнку 7.

    Для ілюстрації ефективності алгоритмів сортування в екстремальних випадках використовуються масиви з 20000 елементів, впорядкованих по зростанню і за спаданням. При сортування методом бульбашки і сортування вставками виконується тільки один прохід масиву, впорядкованого за зростанням, у той час як сортування за допомогою вибору залежить тільки від розміру списку і виробляє 19999 проходів. Упорядкованість даних за спаданням є найгіршим випадком для бульбашкової, обмінної та сортування вставками, зате сортування вибором виконується, як звичайно.        

    n         

    Обмінна сортування         

    Сортування вибором         

    Бульбашкова сортування         

    Сортування вставками             

    4 000         

    12.23         

    17.30         

    15.78         

    5.67             

    8 000         

    49.95         

    29.43         

    64.03         

    23.15             

    10 000         

    77.47         

    46.02         

    99.10         

    35.43             

    15 000         

    173.97         

    103.00         

    223.28         

    80.23             

    20 000         

    313.33         

    185.05         

    399.47         

    143.67     

    Рис.7 Порівняння сортувань порядку O (n2)        

    n         

    Обмінна сортування         

    Сортування вибором         

    Бульбашкова сортування         

    Сортування вставками             

    8 000 (впорядкований по   зростанням)         

    185.27         

    185.78         

    0.03         

    0.05             

    8 000 (впорядкований по   спаданню)         

    526.17         

    199.00         

    584.67         

    286.92     

    У загальному випадку QuickSort є найшвидшим алгоритмом. Завдяки своїй ефективності, що дорівнює O (n log2n), він явно перевершує будь-який алгоритм порядку O (n2). Судячи з результатів випробувань, наведених в наступній таблиці, він також швидше будь-який з сортувань порядку O (n log2n), розглянутих нами в попередньому номері. Зверніть увагу, що ефективність «швидкої» сортування становить O (n log2n) навіть в екстремальних випадках. Зате сортування за допомогою пошукового дерева стає в цих випадках O (n2) складною, тому що сформоване дерево є виродженим.        

    n         

    Турнірна сортування         

    Сортування за допомогою   дерева         

    Пірамідальна сортування         

    "Швидка"   сортування             

    4 000         

    0.28         

    0.32         

    0.13         

    0.07             

    8 000         

    0.63         

    0.68         

    0.28         

    0.17             

    10 000         

    0.90         

    0.92         

    0.35         

    0.22             

    15 000         

    1.30         

    1.40         

    0.58         

    0.33             

    20 000         

    1.95         

    1.88         

    0.77         

    0.47             

    8 000 (впорядкований по   зростанням)         

    1.77         

    262.27         

    0.75         

    0.23             

    8 000 (впорядкований по   спаданню)         

    1.65         

    275.70         

    0.80         

    0.28     

    Рис.8 Порівняння сортувань порядку O (n log2n)

    Порівняння сортувань

    Ця програма здійснює порівняння алгоритмів сортування даних, представлених на рисунках 7 і 8. Тут ми наводимо тільки базову структуру програми. Хронометраж проводиться за допомогою функції TickCount, що повертає число 1/60 часток секунди, що минули з моменту старту програми.        

    # include   

    # include "arrsort.h"      

    // Перечіслімий тип,   що описує початковий стан масиву даних.   

    enum Ordering (randomorder, ascending, descending);      

    // Перечіслімий тип,   ідентифікує алгоритм сортування.   

    enum SortType   

    (   

    SortTypeBegin,   

    exchange = SortTypeBegin,   

    selection,   

    bubble,   

    insertion,   

    tournament,   

    tree,   

    heap,   

    quick,   

    SortTypeEnd = quick   

    );      

    // копіювати n-елементний масив y в масив x   

    void Copy (int * x, int * y, int n)   

    (   

    for (int i = 0; i   

    * x + + = * y ++;   

    )      

    // Загальна сортуються   функція, яка приймає вихідний масив   

    // із заданою   упорядкованістю елементів і застосовує вказаний   

    // алгоритм сортування.   

    void Sort (int a [], int n, SortType type, Ordering order)   

    (   

    long time;      

    cout << "Сортування" <   

    // Вивести тип впорядкованості.   

    switch (order)   

    (   

    case random:   

    cout << "елементів.";   

    break;   

    case ascending:   

    cout << "елементів,   упорядкованих за зростанням. ";   

    break;   

    case descending:   

    cout << "елементів,   упорядкованих за спаданням. ";   

    break;   

    )   

    // засікти час   

    time = TickCount ();      

    // Виконати сортування і вивести її тип ...   

    switch (type)   

    (   

    case exchange:   

    ExchangeSort (a, n);   

    cout << "Сортування обміном:";   

    break;   

    case selection:   

    SelectionSort (a, n);   

    cout << "Сортування вибором:";   

    break;   

    case bubble:. . . . . . .   

    case insertion:. . . . . . .   

    case tournament:. . . . . . .   

    case tree:. . . . . . .   

    case heap:. . . . . . .   

    case quick:. . . . . . .   

    )      

    // Підрахувати час виконання у секундах.   

    time = TickCount () - time;   

    cout <

    )      

    // Виконує сортування   масиву з n елементами,   

    // розташованих в порядку,   що визначається параметром order.   

    void RunTest (int n, Ordering order)   

    (   

    int i;   

    int * a, * b;      

    SortType stype;   

    RandomNumber rnd;      

    // Виділити пам'ять для двох n-елементних   масивів a і b.   

    a = new int [n];   

    b = new int [n];      

    // Визначити тип впорядкованості даних.   

    if (order == randomorder)   

    (   

    // Заповнити масив b випадковими числами.   

    for (i = 0; i   

    b [i] = rnd.Random (n);   

    )   

    else   

    (   

    // Дані, відсортовані за   зростанням.   

    for (i = 0; i   

    b [i] = i;   

    )   

    else   

    (   

    // дані, відсортовані за спаданням.   

    for (i = 0; i   

    b [i] = n - 1 - i;   

    )   

    else   

    (   

    // Копіювати дані в масив a.   По черзі виконати сортування для   

    // кожного типу.   

    for (stype = SortTypeBegin;   stype <= SortTypeEnd; stype = SortType (stype +1))   

    (   

    Copy (a, b, n);   

    Sort (a, n, stype, order);   

    )   

    )      

    // Видалити обидва динамічних масиву.   

    delete [] a;   

    delete [] b;   

    )      

    // Відсортувати 4 000 -, 8   000 -, 10 000 -, 15 000 - і 20 000-елементний масиви,   

    // заповнені випадковими   числами.   

    // Потім спочатку   відсортувати 20 000-елементний масив, упорядкований   

    // за зростанням, а потім   за спаданням.   

    void main (void)   

    (   

    int nelts [5] = (4000, 8000,   10000, 15000, 20000);   

    int = i;      

    cout.precision (3);   

    cout.setf (ios:: fixed |   ios:: showpoint);      

    for (i = 0; i <5; i ++)   

    RunTest (nelts [i],   randomorder);   

    RunTest (20000, ascending);   

    RunTest (20000, descending);     

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.rsdn.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status