powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка массива структур методом вставки
6 сообщений из 6, страница 1 из 1
Сортировка массива структур методом вставки
    #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
Сортировка массива структур методом вставки
    #39732008
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сортировка вставками гораздо лучше делается на односвязном списке, чем на массиве. Заодно
отпадёт и вопрос "отсортировал значения углов точек, а их сами нет", ибо точка будет
представлена структурой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сортировка массива структур методом вставки
    #39732012
else aaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov Сортировка вставками гораздо лучше делается на односвязном списке, чем на массиве. Заодно
отпадёт и вопрос "отсортировал значения углов точек, а их сами нет", ибо точка будет
представлена структурой.
Списки мы успешно не проходили, я не знаю, что это. Препод много болеет.
...
Рейтинг: 0 / 0
Сортировка массива структур методом вставки
    #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
Сортировка массива структур методом вставки
    #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
Сортировка массива структур методом вставки
    #39733866
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
else aaa,

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

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


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