Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка массива структур методом вставки / 6 сообщений из 6, страница 1 из 1
12.11.2018, 18:39
    #39732003
else aaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка массива структур методом вставки
Нужна помощь со сборкой задачи.

Задача: Соединить конечное множество точек на плоскости замкнутой линией без самопересечений с вершинами в этих точках.(Ответом будет порядок обхода точек плоскости). Подсказка: перейти к полярным координатам и упорядочить точки по значениям угла, а для точек с одинаковым значением угла -по расстоянию до полюса.Используйте алгоритм сортировки вставками.

Если кто не знает, в полярной системе координат также как и в декартовой есть две координаты: полярный радиус и полярный угол. Полярный радиус это расстояние от точки О - полюса до заданной точки Полярный угол это угол между полупрямой ОХ(полупрямой, т.к нет отрицательных значений, это как обычная декартова ОХ, но без отрицательных значений) и полярным вектором от точки О до заданной точки. Отсчитывается против часовой стрелки.

Сделал массив структур, задал их, перевёл с помощью функции координаты в полярные. И дальше проблема - сортировка. Я в ней не шарю. Отсортировал значения углов точек, а их сами нет. Нужно как-то отсортировать точки по сначала оп углам(у), а потом те, которые в значениях углов совпадают, отсортировать по значению радиуса. Помогите пожалуйста, скоро сдавать.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;

struct Point
{
	double x;
	double y;
};

void conv(double& x1, double& y1)
{
	double rad = sqrt(x1*x1 + y1*y1),
		ygol = acos(x1 / rad);
	x1 = rad;
	y1 = ygol;
}

int main()
{
	const int N = 10;
	setlocale(LC_ALL, "Russian");
	Point A[N];
	for (int i = 0; i < N; i++)
	{
		cout << "Введите координаты точки номер " << i + 1 << ":   ";
		cin >> A[i].x >> A[i].y;
		cout << "Точка номер " << i + 1 << " с декартовыми координатами " << A[i].x << ";" << A[i].y << endl;
		conv(A[i].x, A[i].y);
		cout << "Данная точка имеет полярные координаты " << A[i].x << ";" << A[i].y << endl;
	}
	int max, num, k=0;
	while (k < N)
	{
		max = INT_MIN;
		for (int i = N - 1; i >= k; i--)
		{
			if (A[i].y > max)
			{
				max = A[i].y;
				num = i;
			}
		}
		for (int i = num; i >= k; i--)
		{
			A[i].y = A[i - 1].y;
		}

		A[k].y = max;
		k++;
	}
	for (int i = N - 1; i >1; i--)
	{
		if (A[i].y = A[i - 1].y)
		{
			if (A[i].x < A[i - 1].x){
				Point tmp;
				tmp = A[i];
				A[i] = A[i - 1];
				A[i - 1] = tmp;
			}
		}
	}
		cout << "Точки отсортирован\n";
		for (int i = 0; i < N; i++)
		{
			cout << A[i].x<< " ";
		}
	
	system("pause");
	return 0;
}
...
Рейтинг: 0 / 0
12.11.2018, 18:49
    #39732008
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка массива структур методом вставки
Сортировка вставками гораздо лучше делается на односвязном списке, чем на массиве. Заодно
отпадёт и вопрос "отсортировал значения углов точек, а их сами нет", ибо точка будет
представлена структурой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.11.2018, 18:54
    #39732012
else aaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка массива структур методом вставки
Dimitry Sibiryakov Сортировка вставками гораздо лучше делается на односвязном списке, чем на массиве. Заодно
отпадёт и вопрос "отсортировал значения углов точек, а их сами нет", ибо точка будет
представлена структурой.
Списки мы успешно не проходили, я не знаю, что это. Препод много болеет.
...
Рейтинг: 0 / 0
12.11.2018, 20:09
    #39732041
else aaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка массива структур методом вставки
В общем, вот код, но есть одна большая проблема: это не сортировка вставками, а надо именно вставками. Помогите, пожалуйста.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <time.h>
using namespace std;
struct Point
{
	int ind;     // исходный индекс точки, что бы сохранить порядок при сортировке
	double x;    // координата X
	double y;    // координата Y
	double a;    // угол в градусах
	double r;    // радиус

	void conv() // посчитать <a> и <r>
	{
		r = sqrt(x*x + y*y);

		if (r == 0.0)
		{
			a = 0.0;
		}
		else
		{
			a = 180.0 * acos(x / r) / acos(-1.0);
			if (y < 0)
				a += 180;
		}
	}

	int compare(Point &right) // сравнить this (левый операнд) с указанной структурой <right> (правый операнд)
	{
		if (a < right.a)
			return -1; // меньше
		if (a > right.a)
			return 1; // больше

		// углы равны, сравниваем радиус

		if (r < right.r)
			return -1; // меньше
		if (r > right.r)
			return 1; // больше

		return 0; // точки совпадают
	}
};

int main()
{
	const int N=10;
	srand((unsigned int)time(0));

	Point points[N];

	// инициализация
	for (int i = 0; i < N; i++)
	{
		points[i].ind = i;
		points[i].x = 200 * rand() / RAND_MAX - 100;
		points[i].y = 200 * rand() / RAND_MAX - 100;

		points[i].conv();
		cout << i + 1 << ") (x=" << points[i].x << ", y=" << points[i].y << ") - (a=" << points[i].a << ", r=" << points[i].r << ")" << endl;
	}

	// сортировка
	for (int i = 0; i < N - 1; i++)
	{
		for (int j = i + 1; j < N; j++)
		{
			if (points[i].compare(points[j]) > 0)
			{
				Point temp = points[i];
				points[i] = points[j];
				points[j] = temp;
			}
		}
	}

	// результат сортировки
	cout << endl;
	for (int i = 0; i < N; i++)
	{
		std::cout << points[i].ind + 1 << ") a=" << points[i].a << ", r=" << points[i].r << endl;
	}
	cout << endl;

	system("pause");
	return 0;
...
Рейтинг: 0 / 0
13.11.2018, 05:48
    #39732115
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка массива структур методом вставки
else aaaэто не сортировка вставками, а надо именно вставками
Надо, для начала, сделать пару функций, для вставки и выдёргивания элемента по индексу.
Т.е. есть у тебя массив
Код: plaintext
1.
Point points[N];


Ты выдёргиваешь элемент M, все элементы правее его сдвигаешь на 1 влево.
Так же со вставкой: надо поставить новый элемент на место M, сдвигаешь сначала все элементы с позиции М включительно вправо, потом "вставляешь" новый элемент по индексу M.

А после этого, вместо свапа
Код: plaintext
1.
2.
3.
Point temp = points[i];
points[i] = points[j];
points[j] = temp;


делаешь выдёргивание-вставку этими самыми функциями.

Такой был план?
...
Рейтинг: 0 / 0
16.11.2018, 08:24
    #39733866
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка массива структур методом вставки
else aaa,

это всё хорошо, перевёл в полярную си-му координта, отсортировал order by fi, R и получил порядок

только вопрос:
где должен быть центр полярных координат?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка массива структур методом вставки / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]