Как отсортировать двумерный массив в c
Перейти к содержимому

Как отсортировать двумерный массив в c

  • автор:

Как отсортировать двумерный массив в c

Помогите разобраться с сортировкой пожалуйста.

Я сделал сортировку по строкам(соответственно по столбцам тоже могу), а можно ли отсортировать массив вот по такому типу, если можно то как?:

исходная матрица:
8 6 9 4
3 9 4 7
1 7 2 9
3 7 5 1

после сортировки:
1 1 2 3
3 4 4 5
6 7 7 7
8 9 9 9

/*Сортировка двумерного массива*/ #include #include void main() < clrscr(); const int raw = 20, col = 20; int a[raw][col], i, j, n, k, tmp, m; printf("Введите размер матрицы: "); scanf("%d", &n); printf("\n"); for(i = 0; i < n; i++) < for(j = 0; j < n; j++) < printf("a[%d][%d] = ", i, j); scanf("%d", &a[i][j]); >> for(i = 0; i < n; i++) < printf("\n"); for(j = 0; j < n; j++) < printf("%d ", a[i][j]); >> for(i = 0; i a[i][k + 1]) < tmp = a[i][k]; a[i][k] = a[i][k + 1]; a[i][k + 1] = tmp; >> > for(i = 0; i < n; i++) < printf("\n"); for(j = 0; j < n; j++) < printf("%d", a[i][j]); >> getch(); >

Последний раз редактировалось savra; 25.11.2009 в 18:07 .

Отсортировать двумерный массив по возрастанию по строкам

Отсортировать двумерный массив по строкам
Как записать этот код для двух мерного массива A , что бы сортировало отдельно каждую строку .

Упорядочить по строкам произвольный двумерный массив по возрастанию
Скажите, пожалуйста, где тут ошибка? Задание: Упорядочить по строкам произвольный двумерный массив.

отсортировать двумерный массив по строкам без доп массивов
Подскажите плз как отсортировать массив двумерный по строкам, не используя доп массивов (как я.

Массив: Отсортировать двумерный массив по строкам и столбцам
Помогите! Дали задачу по программированию на бейсике, но у меня как-то с этим не заладилось.Задача.

41 / 40 / 23
Регистрация: 10.03.2012
Сообщений: 374

Лучший ответ

Сообщение было отмечено как решение

Решение

Вот эта функция сортирует двумерный массив

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
typedef int *pInt; void Sort(int m, int n, pInt *B) { int tmp; for(int k = 0; k  m * n; k ++) for(int i = 0; i  m; i ++) for(int j = 0; j  n; j ++) { if((B[i][j] > B[i][j + 1]) && j != n - 1) { tmp = B[i][j]; B[i][j] = B[i][j + 1]; B[i][j + 1] = tmp; } if((B[i + 1][0]  B[i][j]) && (i != m - 1)) { tmp = B[i + 1][0]; B[i + 1][0] = B[i][j]; B[i][j] = tmp; } } }

Сортировка двумерного массива по возрастанию

Помогите, пожалуйста с задачей.
Необходимо отсортировать двумерный массив по возрастанию (не переводя его в одномерный).

Должно получиться примерно так:
0 0 1 1
2 3 4 5
7 8 9 9

С помощью одномерного массива — у меня получилось. А как без него не представляю даже:'(

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Сортировка строк двумерного массива по возрастанию значений первого столбца
Люди добрые помогите, пожалуйста! Суть задачи такова: 1. Создать двумерный массив 2.

Сортировка массива: сначала положительные по возрастанию, потом отрицательные по возрастанию
Пользователь вводит массив чисел,нужно отсортировать его методом выбора,что бы сначала шли.

Ошибка при сортировке двумерного массива по возрастанию
По убыванию сортировка работает полноценно,а по возрастанию первое число НЕ понимаю откуда.

Упорядочить строки двумерного массива по возрастанию их наибольших элементов.
Нужно упорядочить его строки по возрастанию их наибольших элементов. #include "stdafx.h".

Эксперт С++

2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496

1 2 3 4 5 6 7
for(int i=0;in;i++) { for(int j=0;jm;j++) { }; };

такой цикл пробегает массив в нужном порядке.
Регистрация: 01.02.2009
Сообщений: 4

Но я понимаю, как пробежать по двумерному массиву в нужном порядке. У меня проблема в том что я не могу придумать как связать это с этим алгоритмом сортировки для одномерного массива:

1 2 3 4 5 6 7 8 9 10 11 12
for(int i=0; isize-1; i++) { for(int j=size-1; j>i; j--) { if (a[j]a[j-1]) { int tmp=a[j]; a[j]=a[j-1]; a[j-1]=tmp; } } }

Если двумерный перевести в одномерный, отсортировать по этому алгоритму и потом перевести назад в двумерный — нет проблем. А как без перевода?

P.S. Извините за код. Не разобралась пока, как делать вложения

Эксперт С++

2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496

ЦитатаСообщение от Lyric Посмотреть сообщение

Но я понимаю, как пробежать по двумерному массиву в нужном порядке. У меня проблема в том что я не могу придумать как связать это с этим алгоритмом сортировки для одномерного массива

А если тебе скажут,например,через один сортировать — тоже не поймешь,как связать? Самая простая сортировка — пузырьком — требует способа пробежать массив от начала до конца. Два раза — во вложенных циклах. Вперед!

Регистрация: 01.02.2009
Сообщений: 4

XuTPbIu_MuHTAu, я понимаю, для Вас это легко. А я начала учить программирование два месяца назад — сейчас рассматриваю задачки месячной давности и смеюсь над тем, как я над ними корпела.

Но все равно — спасибо за пинок!
Ушла думать

Эксперт С++

2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496

ЦитатаСообщение от Lyric Посмотреть сообщение

Но все равно — спасибо за пинок!
Ушла думать

Правильный подход.После того,как отчаешься — помучайся еще полчаса, потом закрой все нафиг,уйди гулять,спать или еще что-нибудь.На следующий день открой заново и просмотри программу всю — сверху вниз,внимательно — если просто не работает.Обычно срабатывает. Если так и не будет идеи — обращайся.

181 / 33 / 7
Регистрация: 29.10.2008
Сообщений: 283
Чет я тебя не пойму. Используй вложенный цикл, и внутри второго for используй пузырьковую сортировку
Регистрация: 01.02.2009
Сообщений: 4

Ой, это я кажется, неправильно объяснила условие

ЦитатаСообщение от Бартимеус Посмотреть сообщение

Используй вложенный цикл, и внутри второго for используй пузырьковую сортировку

Если сделать как ты говоришь, массив отсортируется по строкам — каждая строка отдельно (или по столбцам). Это действительно просто.

А мне нужно отсортировать весь массив. Например:

3 2 9 0
7 1 0 8
5 9 4 1 массив

0 2 3 9
0 1 7 8
1 4 5 9 сортировка по строкам

0 0 1 1
2 3 4 5
7 8 9 9 сортировка всего массива

181 / 33 / 7
Регистрация: 29.10.2008
Сообщений: 283

попробуй использовать условие: если елемент массива[1][3]>елемент массива[2][0] то поменять их местами

Регистрация: 24.12.2008
Сообщений: 32

Лучший ответ

Сообщение было отмечено как решение

Решение

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
//сортировка двухмерного массива //по возрастанию //массив заполняется "случайными"числами с помощью rand() #include #include #include using namespace std; int main() { setlocale(0,"");//чтоб консоль писала по русски srand(time(NULL)); const int str=5; const int stolb=5; int mass[str][stolb]; int i,j,a,c,e=1,d=100,temp,x,z; //заполняем двухмерный массив и выводим на экран //______________________________________________________________________________ cout"До сортировки""\n\n"; for(i=0;istr;i++) { for(j=0;jstolb;j++) { a=rand()%(d-e)+e; mass[i][j]=a; coutmass[i][j]"\t"; } cout"\n\n\n\n"; } cout"\n\n"; //Сортируем массив //_______________________________________________________________________________ for(c=0;c(str*stolb);c++)//колличество проходов { //в строках упорядочиваем //____________________________________________ for(i=0;istr;i++) { for(j=0;jstolb-1;j++) { if(mass[i][j]>mass[i][j+1]) { temp=mass[i][j]; mass[i][j]=mass[i][j+1]; mass[i][j+1]=temp; } } } //в столбах упорядочиваем //_____________________________________________ for(x=0;xstolb;x++) { for(z=0;zstr-1;z++) { if(mass[z][x]>mass[z][x+1]) { temp=mass[z][x]; mass[z][x]=mass[z][x+1]; mass[z][x+1]=temp; } } } } //вывод на экран после сортировки //__________________________________________________________ cout"После сортировки по возрастанию""\n\n\n\n"; for(i=0;istr;i++) { for(j=0;jstolb;j++) { coutmass[i][j]"\t"; } cout"\n\n\n\n"; } system("pause"); }

не фонтан но работает.учу 2 месяца всего. так что сильно не пинать.

1 2 3 4 5 6 7 8 9 10 11
for (i=0;in;i++) for (j=0;jn;j++) for (a=0;an;a++) for (b=0;bn;b++) if (array[a][b]>array[i][j]) { temp=array[a][b]; array[a][b]=array[i][j]; array[i][j]=temp; }

Это больше подходит заданию Lyric
у меня вот так всё вышло (подобное задание)

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
#include #include #include #define MAX 3 void main (){ clrscr(); //initialize mas int mas[MAX][MAX]; //get random mas int i, j; for (i = 0; iMAX; i++) for (int j = 0; jMAX; j++) mas[i][j] = rand() % 8; //original mass cout<"Original: "; for (i = 0; iMAX; i++) for (int j = 0; jMAX; j++) cout<"mas["<"]["<"] = "[i][j]; //sort mas for (i = 0; i  MAX*MAX; i++) { for (int j = (MAX*MAX)-1; j>i;j--) { if (((int *)mas)[j]  ((int *)mas)[j-1]) { int temp = ((int *)mas)[j]; ((int *)mas)[j] = ((int *)mas)[j-1]; ((int *)mas)[j-1] = temp; } } } //show mas cout<"Sorted: "; for (i = 0; iMAX; i++) for (int j = 0; jMAX; j++) cout<"mas["<"]["<"] = "[i][j]; //wait getch(); }

Регистрация: 01.05.2012
Сообщений: 59
Как вариант, если нужно, чтоб не выводило в отдельном цикле

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
#include "stdafx.h" #include #include "stdlib.h" #include #include #include "iomanip" using namespace std; //sort postro4no int _tmain(int argc, _TCHAR* argv[]) {m1:int const n=7,m=8; system("cls"); int A[n][m],i,j,k,c,l,a,b; cout" "; for(i=0;in;i++) {for(j=0;jm;j++) {A[i][j]=rand()%9+1; //inits. coutA[i][j]setw(2);}coutendl;} coutendl; for(i=0;in;i++) {for(j=0;jm;j++) {for(k=j+1;km;k++) {if(A[i][j]>A[i][k]) {c=A[i][j]; A[i][j]=A[i][k]; A[i][k]=c;}} for (a=i+1;an;a++) {for (b=0;bm;b++) {if (A[i][j]>A[a][b]) {c=A[i][j]; A[i][j]=A[a][b]; A[a][b]=c;}}} coutA[i][j]setw(2);}coutendl;} coutendl"One more? (1-yes,0-no)"; int x; cin>>x; if (x==1) {goto m1;} return 0; }

4055 / 3308 / 924
Регистрация: 25.03.2012
Сообщений: 12,447
Записей в блоге: 1

ЦитатаСообщение от Olgert Посмотреть сообщение

Это больше подходит заданию Lyric
Это излишне много циклов.

ЦитатаСообщение от KoMaTo3Huk Посмотреть сообщение

Как вариант, если нужно, чтоб не выводило в отдельном цикле

Это много циклов + вырвиглазное оформление.

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
const int size=10; int a[size][size]; void sort(){ int inext, jnext; int i, j; int temp; bool sorted=false; while(!sorted){ sorted=true; i=0; j=0; for(inext=0; inextsize; inext++) for(jnext=(inext?0:1); jnextsize; jnext++) { if(a[i][j]>a[inext][jnext]){ temp=a[i][j]; a[i][j]=a[inext][jnext]; a[inext][jnext]=temp; sorted=false; } i=inext; j=jnext; } } }

Добавлено через 8 минут
//сортировка пузырьком по аналогии с сортировкой одномерного массива
//перебираем элементы по очереди, начиная с a[0][1]
//в двойном вложенном цикле, словно выводим 2д массив
//и сравниваем в цикле элемент с предыдущим, а не со следующим
i=inext, j=jnext; //а в роли индекса предыдущего элемента выступает значение,
//запомненное в конце предыдущей итерации цикла! в этом вся моя фишка.
//Благодаря этому не нужно лишних условий на границах массива
//и мучительных попыток выбора то ли a[i+1][j] то ли a[0][j+1] на роль следующего элемента

Добавлено через 2 минуты
Сделано на основе оптимизированного варианта сортировки пузырьком одномерных массивов
http://neerc.ifmo.ru/wiki/inde. 0.B8.D1.8F

Регистрация: 18.03.2013
Сообщений: 43
почему выдает ошибку в сортировке?

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
void main(void) // головная программа { setlocale (0, "Rus"); // русский язык int a; do { int count=0; // счетчик int count1=0; int n; // переменая для количества строк int m; //переменая для количества столбцов int i; //обьяв. переменую int j; //обьяв. переменую cout"введите количество строк"endl; cin>>n;// вводим кол строк cout"введите количество столбцов"endl; cin>>m;// водим количество столбцов int**mass=new int*[n]; // динамическое for (i=1; in; i++) // выделение mass[i]=new int[m]; // памяти под массив cout"введите элементы массива"endl; for (i=1; in; i++) { for (j=1; jm; j++) { cin>>mass[i][j];// водим массив } } for (i=1; in; i++) { for (j=1; jm; j++) { if (mass[i][j]==0)// если не равно 0 тогда. { count1++;//нарастили счетчик } } if (!count1)// если коли. нулевых элементов в массиве равно количество строк тогда { count++;// нарастили счетчик } count1=0;// обнулили счетчик } cout"количество строк не содержащие нулевые эжлементы "countendl;// выводим результат for(int k = 1; k m * n; k ++) for(int i = 1; i n; i ++) for(int j = 1; j m; j ++) { if((mass[i][j] > mass[i][j + 1]) && j != n - 1) { int tmp = mass[i][j]; mass[i][j] = mass[i][j + 1]; mass[i][j + 1] = tmp; } if((mass[i + 1][0]  mass[i][j]) && (i != m - 1)) { int tmp = mass[i + 1][0]; mass[i + 1][0] = mass[i][j]; mass[i][j] = tmp; } } for(i=1;in;i++) { for(j=1;jm;j++) { coutmass[i][j]"\t"; } cout"\n\n\n\n"; } cout  "Повторить нажми 0"  endl; // вывод сообщения на экран cin>> a; } while(a==0); }

4055 / 3308 / 924
Регистрация: 25.03.2012
Сообщений: 12,447
Записей в блоге: 1

потому что вопрос задать на форуме не умеешь. Какую именно ошибку? Зачем эти очевидные комментарии? Почему прогу читать невозможно из-за отсутствия тегов и отступов?
Лучше разберись в моём коде. Потому что твой ещё и в два раза больше

413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 786

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
//сортировка пузырьком #include #include #include #include #include void printMatrix(int[][12], const int); using namespace std; int main() { SetConsoleCP(1251); SetConsoleOutputCP(1251); const int SIZE = 12; int matrix[SIZE][SIZE]; int temp; srand(time(NULL)); cout"До сортировки""\n\n"; //заполняем массив случайным образом for(int i = 0; i  SIZE; i++) for(int j = 0; j  SIZE; j++) matrix[i][j] = 1 + rand() % 100; printMatrix(matrix, SIZE); //сортируем пузырьком for(int N = 1; N  SIZE * SIZE; N++) { for(int i = 0; i  SIZE; i++) { for(int j = 0; j  SIZE - 1; j++) { if(matrix[i][j + 1]  matrix[i][j]) { temp = matrix[i][j + 1]; matrix[i][j + 1] = matrix[i][j]; matrix[i][j] = temp; } } //сравниваем последний элемент текущей строки //с перым элементом следующей if(matrix[i + 1][0]  matrix[i][SIZE - 1]) { temp = matrix[i + 1][0]; matrix[i + 1][0] = matrix[i][SIZE - 1]; matrix[i][SIZE - 1] = temp; } } } cout  "\n\n"; cout"После сортировки по возрастанию""\n\n"; printMatrix(matrix, SIZE); return 0; } //печать массива void printMatrix(int mx[][12], const int SIZE) { for(int i = 0; i  SIZE; i++) { for(int j = 0; j  SIZE; j++) cout  setw(4)  mx[i][j]; cout  "\n"; } }

Регистрация: 28.02.2013
Сообщений: 62

Сел и задумался над этой задачкой без попыток подсмотреть и у меня за 2 часа пыхтения вот что получилось:
любой массив в памяти записывается последовательно, дополнительные индексы служат лишь упрощением для поиска элементов. Вот я и взял простейший алгоритм сортировки «погружения» или «пузырьковой», добавил бардюр, что бы сортировка не вылезла за пределы массива, и у меня получилась довольно простенькая программа. Возможно варианты выше будут правильнее за счет масштаба, но в случае, если вообще никак не получается вразумить как это работает, мой текст вмещает только все самое элементарное, в нем разберется даже новичек, который с++ знаком на 0 уровне.

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
//сортировка пузырьком #include const int size =4; void print_MAC (int[][size]); // подключаемая фу-ция для вывода массива main () { int MAC[size][size]={{1,6,2,8},{9,0,7,9},{7,2,4,1},{5,2,1,8}};// предопределенный массив print_MAC(MAC); for(int pass=0; pass(size*size);pass++)//for 1| проход по всему массиву  for (int a = 0;asize;a++) // for 2 // сортировка } // закрытие "бардюра" } // закрытие for 3 } // close for 2 } // close for 1 cout; print_MAC(MAC); return 0; } //////////////////////////////////////////////////////////////////////////////// // В Ы В О Д М А С С И В А //////////////////////////////////////////////////////////////////////////////// void print_MAC (int c[][size]) { cout<"\n\n"; for (int A=0; Asize;A++) { for (int B=0;Bsize;B++) cout[A][B]<" "; cout<"\n"; //вывод модифицированного массива } cout<"\n\n\n"; } ////////////////////////////////////////////////////////////////////////////////

Главное помнить, что 5-ый элемент 4-ой строки надо исключать, а то в массив попадет мусор. (MAC[3][4])

Сортировка строк двумерного массива (C++)

Для генерации числа в диапазоне тут используются функции rand_between, get_random_array.

Исходный код программы целиком:

#include #include #include #include using namespace std; int rand_between(const int from, const int to) < // взять по ссылке >int *get_random_array(int n, int from, int to) < // взять по ссылке >int** get_random_matrix(int n, int m) < int** matrix = new int*[n]; for (int i = 0; i < n; ++i) < matrix[i] = get_random_array(m, -10, 20); >return matrix; > void print_array(int* arr, int n) < for (int i = 0; i < n; ++i) < cout cout void print_matrix(int** matrix, int n, int m) < for (int i = 0; i < n; ++i) < print_array(matrix[i], m); >cout bool my_less(int a, int b) < return a < b; >bool my_greater(int a, int b) < return a >b; > void selection_sort(int* array, int n, std::function comparator) < int sortedPart = 0; while (sortedPart < n) < // поиск минимума/максимума в неотсортированной части массива int select_idx = sortedPart; for (int i = select_idx+1; i < n; ++i) < if (comparator(array[select_idx], array[i])) < select_idx = i; >> swap(array[sortedPart], array[select_idx]); ++sortedPart; > > int main() < srand(time(NULL)); const int n = 9, m = 6; int **matrix = get_random_matrix(n, m); print_matrix(matrix, n, m); cout else < selection_sort(matrix[i], m, my_greater); >> print_matrix(matrix, n, m); for (int i = 0; i < n; ++i) < delete[] matrix[i]; >delete[] matrix; >

Для возможности задания отношения порядка (по убыванию/возрастанию) в функцию сортировки в качестве параметра передается компаратор — функция, выполняющая сравнение элементов.

Функция сравнения элементов описывается так:

bool my_less(int a, int b)

В данном случае, она возвращает истину если первый аргумент меньше второго.
Для передачи функции в качестве аргумента используется стандартный модуль библиотеки С++ std::functional :

void selection_sort(int* array, int n, std::function comparator)

Тут записано, что третьим аргументом в функцию передается функция, возвращающая значение типа bool и принимающая два аргумента типа int .

Если в качестве компаратора в функцию передана функция my_less, то вызов:

if (comparator(array[select_idx], array[i]))

Описанный выше алгоритм сортировки реализуется так:

  • переменная sortedPart, изначально равная нулю, хранит размер упорядоченной части массива. Ее значение увеличивается в конце каждой итерации.
  • Во вложенном цикле ищется индекс минимального/максимального элемента (в зависимости от переданного в функцию компаратора). Найденный индекс сохраняется в переменной select_idx:

for (int i = select_idx+1; i < n; ++i) < if (comparator(array[select_idx], array[i])) < select_idx = i; >>
int tmp = array[sortedPart]; array[sortedPart] = array[select_idx]; array[select_idx] = tmp;

Результаты работы программы приведены на рисунке:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *