Помогите решить решенную задачку

  • Автор темы Bio
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Bio

Гость
#1
Помогите решить решенную задачку

Вообще мне надо решить вот это: "Сортировка разделением. Способ разделения : интервал между минимальным и максимальным значениями элементов массива разбить пополам и относительно этого значения разбить массив на две части (с использованием вспомогательных массивов)."
Но, чистя диск, случайно наткнулся на одну прогу. (Откуда взялась – не знаю). Интуитивно догадываюсь, что делает она то что надо. Но врубиться в смысл не могу. Короче, если кому нетрудно, объясните "на пальцах" что она делает. И если это не то что надо, подскажите, как сделать то.
Исходняк:
Код:
#include <stdio.h>

void sort(int A[], int n)
{
int B1[100],B2[100];
int i,i1,i2,s,k;
for (s=1; s!=n; s*=2)	  // Размер группы кратен 2
{				  
for (i=0; i<n/2; i++) // Разделить пополам
{
B1[i]=A[i];
B2[i]=A[i+n/2];
}

i1=i2=0;

for (i=0,k=0; i<n; i++) // Слияние с переходом " скачком"
{
f (i1==s && i2==s)			// при достижении границ обеих
k+=s,i1=0,i2=0;			// групп
if (i1==s) A[i]=B2[k+i2++];
else		// 4 условия слияния по окончании
if (i2==s) A[i]=B1[k+i1++];
else	// групп и по сравнению
if (B1[k+i1 ] < B2[k+i2 ]) A[i]=B1[k+i1++];
else A[i]=B2[k+i2++];
}
}
}

void main()

{
int A[]={3,5,7,4,1,6,8,0};
sort(A,8);
for (int i=0; i<8; i++) printf("%d ",A[i]);
}
Конкретно интересует запись: B1[k+i1++] и ей подобные. Это что и как?
Надо под VS6 без дополнительных библиотек - начальный уровень так сказать
 
B

Bio

Гость
#3
Для: European
Понятно.
Но это в частности. А в целом прога правильная, и как она работает?

Да и ещё один вопрос.
(Не будет этих задач - не будет допуска до экзанмена :-((()
Надо чтобы по экрану скакали шарики, отскакивая от стенок и друг от друга.
Сделал. Скачут. Но не все. Одни вообще не прыгают, какие то не сталкиваются. В чём глюк?
////////////////
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
#include<iostream.h>
#include<graphics.h>
#include<dos.h>
#include<conio.h>

const int R=10, V=10, N=10; //радиус, макс скорость, кол-во
const double pi=3.14;

double angle;
int CurV, x=0, y=1, vx=2, vy=3; //составляющие
int Mol[N][4]; //массив молекул
int k,k1;



void main()
{ int i;
int W,H;

int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "c:\\TC\\BGI");
errorcode = graphresult();

if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
return;
}

randomize();
cleardevice();
W=getmaxx(); H=getmaxy();

for(i=0;i<N;i++) //Выбор начального положения
{
Mol[x]=random(W); //по х
Mol[y]=random(H); //по у
angle=random(360)*pi/180;

CurV=random(V)+1; //скорость
Mol[vx]=CurV*sin(angle); //составляющие по х
Mol[vy]=CurV*cos(angle); //составляющие по у
}

while (!kbhit())
{
for(i=0;i<N;i++)
{ //стираем
setcolor(BLACK);
moveto(Mol[x]-R,Mol[y]-R);
setfillstyle(1,BLACK);
fillellipse(Mol[x]-R,Mol[y]-R,10,10);

Mol[x]+=Mol[vx]; //двигаем
Mol[y]+=Mol[vy];

if (Mol[x]>W-R) //проверяем на столк-е со стенками
{
Mol[x]=W-R;
Mol[vx]=-Mol[vx];
}
if (Mol[x]<R)
{
Mol[x]=R;
Mol[vx]=-Mol[vx];
}
if (Mol[y]>H-R)
{
Mol[y]=H-R;
Mol[vy]=-Mol[vy];
}
if (Mol[y]<R)
{
Mol[y]=R;
Mol[vy]=-Mol[vy];
}

/*--столкновение друг с другом ------------*/
for(k=0;k<N;k++)
{
for(k1=k+1;k1<N;k1++)
{
if (sqrt((double)(Mol[k][x]-Mol[k1][x])*
(double)(Mol[k][x]-Mol[k1][x])+
(double)(Mol[k][y]-Mol[k1][y])*
(double)(Mol[k][y]-Mol[k1][y]))<(R+R))
{
Mol[k1][vx]=-Mol[k1][vx];
Mol[k][vx]=-Mol[k][vx];
}
}
}
/*--------------------------------------*/
//рисуем

setcolor(RED);
moveto(Mol[x]-R,Mol[y]-R);
setfillstyle(1,RED);
fillellipse(Mol[x]-R,Mol[y]-R,10,10);


} //задержка
delay(10);
}
getch();
closegraph();
}
\\\\\\\\\\\\\\\\
 
04.09.2006
2 566
2
#5
Для: Kmet
Ты прав! Я именно это и имел в виду, только выразился не так :) К концу дня проще было словами пояснить ;)
 
B

Bio

Гость
#6
Кто нибудь объяснит как это работает?! B)
 
B

Bio

Гость
#7
Первый вопрос снимается. Додумался сам. Написал и сдал. Работает! Если кого интересует могу выложить исходняк. Кстати,
B1[k+i1++] -> B1[k + (i1++) ] ->B1[k+ ( i1 = i1 + 1 ) ]
это вовсе не это, это значит, что записывается в массив с индексом [k+i1] и затем i1 увеличивается на один.
Однако остаются вопросы по шарикам. Может кто подскажет русский хелп по <graphics.h>?
 
04.09.2006
2 566
2
#8
<!--QuoteBegin-Bio+23:12:2006, 07:54 -->
<span class="vbquote">(Bio @ 23:12:2006, 07:54 )</span><!--QuoteEBegin-->это вовсе не это, это значит, что
[snapback]51564" rel="nofollow" target="_blank[/snapback]​
[/quote]
Тебе же уже это Kmet сказал! Спасибо, что ты открыл мне глаза на жизнь!
 
Статус
Закрыто для дальнейших ответов.