То ли зацикливается, то ли что... quicksort
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
То ли зацикливается, то ли что... quicksort - 2011-04-08 13:03:39.143333
|
|
|
BRAT2
Сообщений: 44
Оценки: 0
Присоединился: 2007-11-06 13:00:18.763333
|
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <stdio.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int *a;
int X;
void __fastcall TForm1::Button2Click(TObject *Sender)
{
this->OpenDialog1->Execute();
AnsiString s=this->OpenDialog1->FileName;
FILE *fp;
fp=fopen(s.c_str(),"r");
char str[250];
X=0;
for(;fgets(str,250,fp)!=NULL;X++);
fseek(fp,0,SEEK_SET);
a=new int[X];
in->Caption="in = ";
for (int i=0;i<X;i++)
{
a[i]=atoi(fgets(str,250,fp));
in->Caption=in->Caption+" "+IntToStr(a[i]);
}
fclose(fp);
}
//---------------------------------------------------------------------------
void Qsort(int * m, int n)
{
int i=0, j=n-1;int l;
int p=m[n/2];
do{
while (m[i]<p) i++;
while (m[j]>p) j--;
if (i<=j)
{
int c=m[i];
m[i]=m[j];
m[j]=c;
i++;j--;
}
}while(j<=i);
if (j>0) Qsort(m,n);
if (n>i) Qsort(m+i,n-i);
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int q;
Qsort(a,X);;
out->Caption="out = ";
for (int i=0;i<X;i++)
{
out->Caption=out->Caption+" "+IntToStr(a[i]);
}
}
//---------------------------------------------------------------------------
in и out это компоненты формы - Label'ы. Из файла все правильно читает массив и выводит. Но вот когда выполняется кликаю на Button1 зависает и все. В чем дело, кто подскажет… Qsort - обычная "быстрая сортировка"
|
|
|
RE: То ли зацикливается, то ли что... quicksort - 2011-04-08 13:09:42.550000
|
|
|
BRAT2
Сообщений: 44
Оценки: 0
Присоединился: 2007-11-06 13:00:18.763333
|
исправил
}while(j<=i); на }while(i<=j);
теперь выводит ошибку во время клика в строке int i=0, j=n-1;
|
|
|
RE: То ли зацикливается, то ли что... quicksort - 2011-04-08 19:39:57.570000
|
|
|
Klofelin
Сообщений: 68
Оценки: 0
Присоединился: 2010-09-03 20:58:52.116666
|
void Qsort(int * m, int n)
{
int i=0, j=n;
int p=m[n/2];
do{
while (m[i]<p) i++;
while (m[j]>p) j--;
if (i<=j)
{
int c=m[i];
m[i]=m[j];
m[j]=c;
i++;j--;
}
}while(i<=j);
if (j>0) Qsort(m,j);
if (n>i) Qsort(m+i,n-i);
}
Вызов должен быть таким: Qsort(a,X-1); ( если m[X-1] - это у тебя последний элемент массива)
|
|
|
|
|