Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2008, 12:49   #1
Perfect.Enemy
 
Регистрация: 10.04.2008
Сообщений: 3
По умолчанию Сортировка многомерных массивов С++

Привет, срочно нужно сортировать массив методом выбора. К примеру дан такой массив
2 5 6 7
1 0 5 6
7 5 6 9
2 0 4 3
Нужно чтобы получилось
0 0 1 2
2 3 4 5
5 5 6 6
6 7 7 9.
Помогите пожалуйста или хотя бы подскажите как такой массив записать как одномерный. Заранее благодарен!
Perfect.Enemy вне форума Ответить с цитированием
Старый 12.04.2008, 14:38   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Perfect.Enemy Посмотреть сообщение
Помогите пожалуйста или хотя бы подскажите как такой массив записать как одномерный. Заранее благодарен!
В C понятие размерности массивов весьма условное и легко гнущееся в любую сторону массой способов, например так:
Код:
int i, a[10][5];
for(i = 0; i < 10*5; ((int *)a)[i] = i++);
Ну а сортировку выбором (с кучей примеров) Вы уже, наверное, видели здесь:
Сортировка выбором — Википедия
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 15:20   #3
Perfect.Enemy
 
Регистрация: 10.04.2008
Сообщений: 3
По умолчанию

Спасибо за ответ, учту такой метод, вот пример моей программы.

Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>

int main(){
randomize();
//--------------------------------------------------------------------
const int n = 7, m = 10;
int i, j;
int A[n][m];
//--------------------------------------------------------------------
printf("Elements of massiv: \n");
for (i = 0; i < n; i++){
	for (j = 0; j < m; j++)
  			 printf("%d",  A[i][j] = random(10));
  			 printf("\n");
}
//--------------------------------------------------------------------
const int k = 20;
int B[k];
//--------------------------------------------------------------------
for (i = 0; i < n; i++){
	for (j = 0; j < m; j++)
   	B[i * m + j] = A[i][j];
}
//--------------------------------------------------------------------
printf("Elements of 10*7 2D massiv in 10*7 massiv: \n");
for (i = 0; i < (n*m); i++){
printf ("%d", B[i]);
printf("\t");
}
//--------------------------------------------------------------------
for (i =0; i <(n*m) - 1; i++){  // поиск минимального элемента n-1 раз
		int b_min  = i; // присвоение минимального первому элементу для сравнения
for (int j = i + 1; j < (n*m); j++){
		if (B[j] < B[b_min]) b_min = j;
      int temp = B[i];
      B[i] = B[b_min];
      B[b_min] = temp;
}
}
//--------------------------------------------------------------------
printf("\n Sorted elements of massiv: \n");
for (i = 0; i < (n*m); i++)
{
printf("%d",  B[i]);
printf("\t");
}
getch();
return 0;
}
Сортировка массива, двумерный массив из 70 элементов, записал, в одномерный, отсортировал, вопрос обозначился такого плана, как обратно уже отсортированный массив вывести на экран в первоначальном двумерном виде.

Последний раз редактировалось merax; 12.04.2008 в 17:44.
Perfect.Enemy вне форума Ответить с цитированием
Старый 12.04.2008, 15:36   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Возникает два вопроса:
1. Зачем Вам понадобился массив B имено как массив, когда проще (если не хочется приводить типы на ходу) объявить B как указатель на int?
2. Как это Вы умудрились затолкать 70 чисел в массив размером 20?
Код:
#include <stdio.h>
int main()
{
	int i, j, a[10][5], *b = (int*)a;
//....................
//....................
	for(i = 0; i < 10*5; b[i] = i++);
//....................
//....................
	for(i = 0; i < 10; i++){
		for(j = 0; j < 5; j++){
			printf("%6d ", a[i][j]);
		}
		putchar('\n');
	}
	getchar();
}
B_N вне форума Ответить с цитированием
Старый 12.04.2008, 16:33   #5
Perfect.Enemy
 
Регистрация: 10.04.2008
Сообщений: 3
По умолчанию

Ответ на первый вопрос очень прост, я просто не подумал об указателях сразу, чтобы B объявить, как указатель на int и этот вариант я попробую реализовать, а вот на второй вопрос ответ таков: в задаче требовалось создать массив из 70 элементов. Но изначально создав программу я ее попробовал на массиве из 20 элементов, поэтому когда решил сделать по заданию по невнимательности своей поменял разверность только первого массива, а второго забыл, но гибкость языка, по всей видимости, позволила мне ошибиться и запихнуть 70 элементов в 20. Спасибо тебе, B_N, потому как я бы работал с этой прогой дальше и, скорее всего даже не заметил бы этой оплошности

Последний раз редактировалось Perfect.Enemy; 12.04.2008 в 16:35. Причина: неверные знаки препинания
Perfect.Enemy вне форума Ответить с цитированием
Старый 12.04.2008, 16:39   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Perfect.Enemy Посмотреть сообщение
но гибкость языка, по всей видимости, позволила мне ошибиться и запихнуть 70 элементов в 20. Спасибо тебе, B_N, потому как я бы работал с этой прогой дальше и, скорее всего даже не заметил бы этой оплошности
Должен обрадовать. Гибкость языка позволила запихнуть 20 элементов в массив B, а 50 оставшихся - в массив A (удачно оказавшийся выше в стэке, может и еще какая переменная подвернулась по дороге). Иначе сортировка успешно "рассортировала" бы стэк выше точки вызова и программа точно бы упала. C требует аккуратности...
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование массивов при вводе данных greenkat Microsoft Office Excel 4 28.02.2008 19:21
Выбрать из двух массивов совпадение. *Иван* Microsoft Office Excel 7 22.11.2007 21:10
Объединение, пересечение, слияние массивов -=Domestos=- Помощь студентам 6 25.12.2006 21:06