Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

c++ быстрая сортировка

28K
15 мая 2008 года
vorovaika
21 / / 07.12.2007
данная программа сортирует суммы значений элементов по возрастанию в столбце...вся программа работает правильно...она считает сравнения и перестановки...НО в быстрой сортировке рекурсия и куууча перестановок из-за этого...как ее убрать и сохранить работающую прогу? спасибо!!!!!!

Код:
#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");
}
}
9
15 мая 2008 года
Lerkin
3.0K / / 25.03.2003
Цитата: vorovaika
...НО в быстрой сортировке рекурсия и куууча перестановок из-за этого...как ее убрать и сохранить работающую прогу?...


Чего убрать-то? функцию qsort? Стираешь её в исходнике этом и все... или рекурсию убрать?

28K
15 мая 2008 года
vorovaika
21 / / 07.12.2007
убрать рекурсию в функции....ну в общем, чтобы сравнения и перестановки нормально считало....а не такие числа выводились
320
16 мая 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: vorovaika
убрать рекурсию в функции....ну в общем, чтобы сравнения и перестановки нормально считало....а не такие числа выводились



Т.е,другими словами нужен алгоритм нерекурсивной быстрой сортировки ?

28K
16 мая 2008 года
vorovaika
21 / / 07.12.2007
ну либо нерекурсивной, либо как-то эту изменить, чтобы быстрая сортировка была действительно наиболее быстрой из всех (по сравнениям и перестановкам)
320
16 мая 2008 года
m_Valery
1.0K / / 08.01.2007
Цитата: vorovaika
ну либо нерекурсивной, либо как-то эту изменить, чтобы быстрая сортировка была действительно наиболее быстрой из всех (по сравнениям и перестановкам)



Нерекурсивная быстрая сортировка,действительно быстрая.:)

28K
16 мая 2008 года
vorovaika
21 / / 07.12.2007
а обойти использование стеков нельзя? просто я с ними не знакома еще..
11
16 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: vorovaika
а обойти использование стеков нельзя? просто я с ними не знакома еще..



Можно использовать пару list & map.
Заполняешь list<> и ключ для map<> одними и темеже значениниями, сортируешь list и затем поочередно пробегаясь по нему дергаешь ключ/значение из map<>

28K
16 мая 2008 года
vorovaika
21 / / 07.12.2007
понятно...точнее не очень...ну ладно...че-нить придумаю.спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог