Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include "ShellSort.h"
- #include "ShellKnut.h"
- #include "ShellSejSort.h"
- using namespace std;
- void SetArray(int *arr,int Size, int Range) {
- for (int i = 0; i < Size; i++)
- arr[i] = rand() % Range;
- }
- void CopyArray(int *arr1, int *arr2, int Size) {
- for (int i = 0; i < Size; i++)
- arr2[i] = arr1[i];
- }
- int main() {
- int Size;
- int Range = 10;
- setlocale(LC_ALL, "rus");
- cout << "Введите размер массива: ";
- cin >> Size;
- cout << endl;
- int *arr1 = new int[Size];
- int *arr2 = new int[Size];
- int *arr3 = new int[Size];
- int *arr4 = new int[Size];
- int *arr5 = new int[Size];
- SetArray(arr1,Size,Range);
- CopyArray(arr1,arr2,Size);
- CopyArray(arr1,arr3,Size);
- CopyArray(arr1,arr4,Size);
- CopyArray(arr1,arr5,Size);
- cout << "Полученный массив :" << endl;
- for (int i = 0; i < Size; i++)
- cout << arr1[i] << " ";
- cout << endl;
- cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
- shellSort(arr2,Size);
- cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
- ShellKnutSort(arr3,Size);
- cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
- ShellSejSort(arr4,Size);
- cout << "+++++++++++++++++++++++++++++++++++++++++++++++" << endl;
- system("pause");
- }
- //////////////////////
- #include <iostream>
- using namespace std;
- int StepSej(int *step, int n) {
- int s;
- int p1, p2, p3;
- p1 = 1;
- p2 = 1;
- p3 = 1;
- s = -1;
- do {
- if (++s % 2) {
- step[s] = 8 * p1 - 6 * p2 + 1; }
- else {
- step[s] = 9 * p1 - 9 * p3 + 1;
- p2 *= 2;
- p3 *= 2;
- }
- p1 *= 2;
- }
- while (3 * step[s] < n);
- return((s > 0) ? (--s) : (0));
- }
- template <typename t>
- void ShellSejSort(t *arr, int length) {
- int step;
- int j,s;
- int stepS[50];
- int compare = 0;
- int swap = 0;
- s = StepSej(stepS, length);
- while (s >= 0) {
- step = stepS[s--];
- for (int i = step; i < length; i++) {
- t temp = arr[i];
- compare++;
- for (j = i - step, compare++; (j >= 0) && (arr[j] > temp); j -= step) {
- arr[j + step] = arr[j];
- swap++;
- }
- arr[j + step] = temp;
- swap++;
- }
- }
- cout << "Сортировка Шелла(Сэджвик) :" << endl;
- for (int i = 0; i < length; i++)
- cout << arr[i] << " ";
- cout <<endl;
- cout << "Количество сравнений " << compare << endl << "Количество перестановок " << swap << endl;
- }
- ///////////////////////
- template <typename t>
- void ShellKnutSort(t *arr, int length){
- int compare = 0;
- int swap = 0;
- int size = length;
- int Step = 1;
- while (Step < size / 3)
- Step = 3 * Step + 1;
- while (Step >= 1) {
- for (int i = Step; i < size; i++) {
- t temp = arr[i];
- int j = i - Step;
- while (j >= 0 && (temp < arr[j])) {
- compare++;
- arr[j + Step] = arr[j];
- j -= Step;
- swap++; }
- arr[j + Step] = temp;
- swap++;
- }
- Step /= 3;
- }
- cout << "Сортировка Шелла(Кнут) :" << endl;
- for (int i = 0; i < length; i++)
- cout << arr[i] << " ";
- cout <<endl;
- cout << "Количество сравнений " << compare << endl << "Количество перестановок " << swap << endl;
- }
- ///////////////////////
- template <typename t>
- void shellSort(t *arr, size_t length) {
- t temp;
- int compare = 0; //количество сравнений
- int swap = 0; //количество сдвигов
- size_t i, j, k;
- for (k = length / 2; k > 0; k /= 2) {
- for (i = k; i < length; i++)
- {
- temp = arr[i];
- for (j = i; j >= k; j -= k) {
- compare++;
- if (temp < arr[j - k]) {
- arr[j] = arr[j - k];
- swap++;
- }
- else
- break;
- }
- arr[j] = temp;
- }
- }
- cout << "Сортировка Шелла :" << endl;
- for (i = 0; i < length; i++)
- cout << arr[i] << " ";
- cout <<endl;
- cout << "Количество сравнений " << compare << endl << "Количество перестановок " << swap << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement