#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
using namespace std;
HANDLE hStdout;
//---------------------------------------------------------------------------------
//объявление функций
void bubble(int **summ,int **ar,const int row,const int col);
void select(int **summ,int **ar,const int row,const int col);
void insert(int **summ,int **ar,const int row,const int col);
void shell(int **summ,int **ar,const int row,const int col);
void quick(int **summ,int **ar,const int row,const int col);
void qs(int **summ,int **ar, int first, int last, const int row,const int col);
int ** newarr(int row, int col);
int ** aclone(int **ar,const int row,const int col);
void printAr(int ** ar, int row, int col);
int sr1,per1,sr2,per2,sr3,per3,sr4,per4,sr5,per5, i, j;
//----------------------------------------------------------------------------------
int main (void)
{
int row, col, t, b, c;
int **summ, **summ1, **ar,**ar1, **ts, **ta;
//формирование исходной матрицы
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hStdout, BACKGROUND_INTENSITY);
SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN);
srand(time(0));
SetConsoleTextAttribute(hStdout, 10);
cout<<"Vveddite kolichestvo strok > 0\n";
cin>>row;
cout<<"Vvedite kolichestvo ctolbtsov> 0\n";
cin>>col;
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 11);
cout<<"Isxodnaya matritsa:\n";
printf("\n");
ar=new int* [row];
for (i=0; i<row; i++)
ar=new int[col];
ar1=new int* [row];
for (i=0; i<row; i++)
ar1=new int[col];
for(i = 0;i < row;++i)
{
ar = new int[col];
for(j = 0;j < col;++j)
ar[j] = rand() % 999;
}
//вывод исходной матрицы
for (i=0; i<row; i++)
{
for (j=0; j<col; j++)
{
printf ("%-4d",ar[j]);
printf(" ");
}
printf("\n");
}
printf("\n");
//--------------------------------------------------------------------------------
//считаем суммы каждого элемента
summ=new int* [row];
for (i=0; i<row; i++)
summ=new int[col];
summ1=new int* [row];
for (i=0; i<row; i++)
summ1=new int[col];
for (j=0; j<col; j++)
{
for (i=0; i<row; i++)
{
t=ar[j]/100;
b=(ar[j]-t*100)/10;
c=(ar[j]-t*100-b*10);
summ[j]=t+b+c;
}
}
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
SetConsoleTextAttribute(hStdout, 12);
//выводим суммы
printf("\n");
printf("Summi elementov:\n");
printf("\n");
printAr(summ,row,col);
//-------------------------------------------------------------------------------------------
//ВЫВОД ОТСОРТИРОВАННЫХ МАССИВОВ
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
SetConsoleTextAttribute(hStdout, 2);
per1=0, sr1=0;
printf("Sortirovka puzirkom:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
bubble(ts, ta, row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 9);
printf("\n");
per2=0, sr2=0;
SetConsoleTextAttribute(hStdout, 14);
printf("\n");
printf("Sortirovka otborom:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
select(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
per3=0, sr3=0;
printf("Sortirovka vstavkami:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
insert(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
printf("\n");
per4=0, sr4=0;
printf("\n");
SetConsoleTextAttribute(hStdout, 7);
printf("\n");
printf("Sortirovka metodom Shella:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
shell(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
per5=0, sr5=0;
cout<<"--------------------------------------------------------------------------------";
printf("\n");
SetConsoleTextAttribute(hStdout, 13);
printf("\n");
printf("Bistraya sortirovka:\n");
ta = aclone (ar,row,col);
ts = aclone (summ,row,col);
quick(ts, ta,row,col);
printf("\n");
SetConsoleTextAttribute(hStdout, 15);
cout<<"--------------------------------------------------------------------------------";
cout<<"Press any key";
_getch();
}
//--------------------------------------------------------------------------------
//сортировка ПУЗЫРЬКОМ
void bubble(int **summ,int **ar,const int row,const int col)
{
int k;
while(1)//пока количество возможных перестановок !=0
{k=0;
for (j=0; j<col; j++)
for (i=0; i<row-1; i++)
{
if (summ[j]>summ[i+1][j])
//сравниваем соседние элементы
{ swap(summ[j],summ[i+1][j]);//упорядочиваем суммы
per1++;
swap(ar[j],ar[i+1][j]);//упорядочиваем массив
sr1++;//считаем сравнения-перестановки
per1++;
k++; }
else{
sr1++;
}}
if (k==0) break; // выход из цикла
}
printAr(ar,row,col);
printf("\n");
printf("sravnenii %d; perestanovok %d\n",sr1,per1);
}
//сортировка ОТБОРОМ
void select(int **summ,int **ar,const int row,const int col)
{
int x,sr2=0,per2=0;
for (j=0; j<col; j++)
for (x=0; x<row-1; x++)
for (i=x+1; i<row; i++)
{ sr2++;
do
{ swap(summ[x][j],summ[j]); //пересатановки в массиве сумм
swap(ar[x][j],ar[j]); //перестановки в исходном массиве
per2++;
sr2++;
}
while (summ[j]<summ[x][j]);
}
printAr(ar,row,col);
printf("\n");
printf("sravnenii %d; perestanovok %d\n",sr2,per2);
}
//сортировка ВСТАВКАМИ
void insert(int **summ,int **ar,const int row,const int col)
{sr3=0,per3=0;
int x,k;
for (j=0; j<col;j++)
for (i=0; i<row; i++)
{
sr3++;
x=summ[j];
per3++;
for (k = i-1;k>=0&& x < summ[k][j]; k--)
{ sr3++;
if (summ[k+1][j]<summ[k][j])
{sr3++;
swap(summ[k+1][j],summ[k][j]);//перестановки в суммах
swap(ar[k+1][j],ar[k][j]);//перестановки в массивах
per3++;
}
}
}
printAr(ar,row,col);
printf("\n");
printf("sravnenii %d; perestanovok %d\n",sr3,per3);
}
void shell(int **summ,int **ar,const int row,const int col)//сортировка методом Шелла
{
int x,y,sr4=0,per4=0;
for (j=0; j<col; j++)
for (i=0; i<row-1; i++)
{
do
{sr4++;
for (x=3; x>0; x--)
{
//элементы, отстоящие на 3..2..1 позицию...
for (y=0; y<row-x; y++)
{
while(summ[y][j]>summ[x+y][j])
{
swap(summ[y][j],summ[x+y][j]);//перестановки сумм
swap(ar[y][j],ar[x+y][j]);//перестановки массива
per4++;
sr4++;
}
}
}
}while(summ[j]>summ[i+1][j]);
}
printAr(ar,row,col);
printf("\n");
printf("sravnenii %d; perestanovok %d\n",sr4,per4);
}
void qs(int **summ,int **ar, int left, int right, const int row,const int col)
{
int p,i,j,com;
for (j=0;j<col;j++)
{
if ((right-left)>0)
{
com=summ[(right+left)/2][j];
i=left;
p=right;
while (i<=p)
{
while (summ[j]<com)
i++;
sr5++;
while (com<summ[j])
p--;
sr5++;
if (i<=p)
{ sr5++;
swap(summ[j],summ[j]);
swap(ar[j],ar[j]);
i++;
p--;
per5++;
}
}
qs(summ, ar, left, p, row, col);
qs(summ, ar, i, right, row, col);
}}
}
void quick(int **summ, int **ar,const int row,const int col)
{
qs(summ, ar, 0, row-1, row, col);
printAr(ar,row,col);
printf("\n");
printf("sravnenii %d; perestanovok %d\n",sr5,per5);
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
int ** newarr(int row, int col)
{
int ** ar, i;
ar = new int* [row];
for (i=0;i<row;i++)
{
ar = new int [col];
}
return ar;
}
int ** aclone(int **ar,const int row,const int col)
{
int **clone;
clone = newarr(row,col);
for (i=0;i<row;i++)
{
for (j=0;j<col;j++)
{
clone[j]=ar[j];
}
}
return clone;
}
void printAr(int ** ar, int row, int col)
{
int i,j;
for (i=0; i<row; i++)
{
for (j=0; j<col; j++)
{
printf ("%-4d",ar[j]);
}
printf("\n");
}
}
c++ быстрая сортировка
данная программа сортирует суммы значений элементов по возрастанию в столбце...вся программа работает правильно...она считает сравнения и перестановки...НО в быстрой сортировке рекурсия и куууча перестановок из-за этого...как ее убрать и сохранить работающую прогу? спасибо!!!!!!
Цитата: vorovaika
...НО в быстрой сортировке рекурсия и куууча перестановок из-за этого...как ее убрать и сохранить работающую прогу?...
Чего убрать-то? функцию qsort? Стираешь её в исходнике этом и все... или рекурсию убрать?
убрать рекурсию в функции....ну в общем, чтобы сравнения и перестановки нормально считало....а не такие числа выводились
Цитата: vorovaika
убрать рекурсию в функции....ну в общем, чтобы сравнения и перестановки нормально считало....а не такие числа выводились
Т.е,другими словами нужен алгоритм нерекурсивной быстрой сортировки ?
ну либо нерекурсивной, либо как-то эту изменить, чтобы быстрая сортировка была действительно наиболее быстрой из всех (по сравнениям и перестановкам)
Цитата: vorovaika
ну либо нерекурсивной, либо как-то эту изменить, чтобы быстрая сортировка была действительно наиболее быстрой из всех (по сравнениям и перестановкам)
Нерекурсивная быстрая сортировка,действительно быстрая.:)
а обойти использование стеков нельзя? просто я с ними не знакома еще..
Цитата: vorovaika
а обойти использование стеков нельзя? просто я с ними не знакома еще..
Можно использовать пару list & map.
Заполняешь list<> и ключ для map<> одними и темеже значениниями, сортируешь list и затем поочередно пробегаясь по нему дергаешь ключ/значение из map<>
понятно...точнее не очень...ну ладно...че-нить придумаю.спасибо!