oscar64/samples/hires/qsort.c

118 lines
1.6 KiB
C

#include <c64/memmap.h>
#include <c64/vic.h>
#include <gfx/bitmap.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define Color ((char *)0xd000)
#define Hires ((char *)0xe000)
Bitmap Screen;
void init(void)
{
mmap_trampoline();
mmap_set(MMAP_RAM);
memset(Color, 0x01, 1000);
memset(Hires, 0x00, 8000);
mmap_set(MMAP_NO_ROM);
vic_setmode(VICM_HIRES, Color, Hires);
vic.color_border = VCOL_WHITE;
bm_init(&Screen, Hires, 40, 25);
}
void done(void)
{
mmap_set(MMAP_ROM);
getch();
vic_setmode(VICM_TEXT, (char *)0x0400, (char *)0x1000);
}
char field[160];
void fill(void)
{
for(int i=0; i<160; i++)
field[i] = i;
}
void shuffle(void)
{
for(int i=0; i<160; i++)
{
int j = rand() % 160;
char t = field[i];
field[i] = field[j];
field[j] = t;
}
}
void draw(unsigned i)
{
bmu_line(&Screen, 2 * i, 0, 2 * i, field[i], 0x00, LINOP_SET);
bmu_line(&Screen, 2 * i, field[i], 2 * i, 160, 0xff, LINOP_SET);
}
void partition(int l, int r)
{
while (l < r)
{
int i = l;
int j = r;
char pi = field[(r + l) >> 1];
while (i <= j)
{
while (field[i] > pi)
i++;
while (field[j] < pi)
j--;
if (i <= j)
{
char t = field[i];
field[i] = field[j];
field[j] = t;
draw(i);
draw(j);
i++;
j--;
}
}
partition(l, j);
l = i;
}
}
int main(void)
{
init();
fill();
shuffle();
for(int i=0; i<160; i++)
draw(i);
clock_t t0 = clock();
partition(0, 159);
clock_t t1 = clock();
char t[20];
sprintf(t, "TIME : %.1f SECS.", (float)(t1 - t0) / 60);
bmu_put_chars(&Screen, 4, 170, t, strlen(t), BLTOP_COPY);
done();
return 0;
}