Задать вопрос
@pervlld

Сортировка Шелла?

Отсортировать первую половину массива по возрастанию, а вторую - по убыванию. Использовать сортировку Шелла.*/

Сделал вроде бы правильно, но где-то ошибки. Помогите пожалуйста исправить
#include <iostream> 
#include <ctime>
using namespace std;

void ShellSort(int** A, int ROW, int COL);

int main()
{
	setlocale(LC_ALL, "rus");
	srand(time(NULL));
	int ROW, COL;
	cout << "Введите кол-во строк" << endl;
	cin >> ROW;
	cout << "Введите кол-во столбцов" << endl;
	cin >> COL;
		
	int** A = new int* [ROW];
	for (int i = 0; i < ROW; i++)
	{
		A[i] = new int[COL];
	}

	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			A[i][j] = rand() % 30;
			cout << A[i][j] << " ";
		}
		cout << endl;
	}
	ShellSort(A, ROW, COL);
	
	for (int i = 0; i < COL; i++)
	{
		delete[] A[i];
	}
	delete[] A;
}

void ShellSort(int** A, int ROW, int COL)
{
	int step, temp;
	int i, j;
	for (int i = 0; i < (ROW * COL); i++)
	{
		// Выбор шага
		for (step = (ROW * COL) / 2; step > 0; step /= 2)
		{
			// Перечисление элементов, которые сортируются на определённом шаге
			for (i = step; i < (ROW * COL); i++)
			{
				// Перестановка элементов внутри подсписка, пока i-тый не будет отсортирован
				for (j = i - step; j >= 0 && A[i, j] > A[i, j + step]; j -= step)
				{
					if (A[i, j] > A[i, j + 1])
					{
						temp = A[i, j];
						A[i, j] = A[i, j + step];
						A[i, j + step] = temp;
						//j-=step;
					}
					if (A[i, j] < A[i, j + 1])
					{
						temp = A[i, j];
						A[i, j] = A[i, j + step];
						A[i, j + step] = temp;
					}
				}
			}
		}
		step = step / 2; //уменьшаем шаг
	}
	

	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			cout << A[i][j] << " ";
		}
		cout << endl;
	}


}
  • Вопрос задан
  • 179 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
NIKITF
@NIKITF
Knows Russian language
Она самая


#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
void Shell(vector<short> &A)
{
	unsigned n = A.size();
	int d = n / 2;
	int j = 0;
	while (d > 0)
	{
		for (int i = 0; i < n - d; i++)
		{
			j = i;
			while (j >= 0 && A[j] > A[j + d])
			{
				swap(A[j], A[j + d]);
				j--;
			}
		}
		d = d / 2;
	}
}
int main()
{
	srand(unsigned(time(0)));
	unsigned n = rand() % 3 + 2, m = rand()%3+2;      
	cout <<"N: " << n << " M: " << m << endl << endl;
	vector<vector<short>> Piligrim;
	for (unsigned f = 0; f < n; f++)
	{
		vector<short> temporary;
		for (unsigned g = 0; g < m; g++)
		{
			temporary.push_back(rand() % 1000);
		}
		Piligrim.push_back(temporary);
	}

	for (const auto& c : Piligrim)
	{
		for (const auto& y : c)
		{
			cout << setw(8) << y;
		}
		cout << endl;
	}

	
	cout << endl << endl;
	cout << "Changed:";
	cout << endl << endl;

	vector<short> BUFFER;
	for (auto u = 0; u < (n*m)/2; u++)
	{
		BUFFER.push_back(Piligrim[u/m][u-(u/m)*m]);
	}

	Shell(BUFFER);

	for (auto u = 0; u < (n * m) / 2; u++)
	{
		Piligrim[u / m][u - (u / m) * n]= BUFFER[u];
	}
	BUFFER.clear();

	for (auto u = (n * m) / 2; u <n*m ; u++)
	{
		BUFFER.push_back(Piligrim[u / m][u - (u / m) * m]);
	}

	Shell(BUFFER);

	for (auto u = (n * m) / 2; u < n* m; u++)
	{
		Piligrim[u / m][u - (u / m) * m] = BUFFER[(n*m)-1-u];
	}
	BUFFER.clear();

	for (const auto& c : Piligrim)
	{
		for (const auto& y : c)
		{
			cout << setw(8) << y;
		}
		cout << endl;
	}

	system("pause");
	return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы