quicksort.cDenna kod är public domain. Om ni hittar fel eller vill ändra något i koden blir jag jätteglad om ni skickar dessa ändringar till jesper [at] fantasi [punkt] se.
/*
* QuickSort lägger alla 'stora' tal i ena änden av listan och alla mindre
* i den andra, delar sedan listan och gör samma sak igen med vardera delen.
* Denna uppdelning fortsätter tills alla listor endast innehåller ett tal.
* Efter detta sätts delarna ihop igen i rätt ordning.
*/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
static int partition(int *numbers, int low, int high)
{
int x = numbers[low];
int i = low - 1;
int j = high + 1;
while (i < j)
{
do
{
j--;
}
while (numbers[j] > x);
do
{
i++;
}
while(numbers[i] < x);
if (i < j)
{
int tmp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = tmp;
}
else
break;
}
return j;
}
static void quickSort(int *numbers, int low, int high)
{
if (low < high)
{
int middle = partition(numbers, low, high);
quickSort(numbers, low, middle);
quickSort(numbers, middle + 1, high);
}
}
int main(void)
{
int tal[20];
int i;
srand((unsigned int)time(NULL));
printf("Talen innan sortering:\n");
for (i = 0; i < 20; i++)
{
tal[i] = (int)((rand() / (double)RAND_MAX) * 1000);
printf("%d ", tal[i]);
}
printf("\n");
quickSort(tal, 0, 19);
printf("Talen efter sortering:\n");
for (i = 0; i < 20; i++)
printf("%d ",tal[i]);
printf("\n");
return EXIT_SUCCESS;
}
|