Avatar billede ares Nybegynder
27. februar 2007 - 08:33 Der er 12 kommentarer og
1 løsning

Hvorfor kan det ikke sortere

har følgende, der skal sorter et array... men den ændre ikke rækkefølgen... den smider bare resultatet ud uændret.

Hvad har jeg gjort forkert ???

#include <stdio.h>

// Swap funktion der lægger array'et i rigtig rækkefølge.
void swap(int d1, int d2)
{
  int temp = d1;
  d1 = d2;
  d2 = temp;
}

int main()
{
int i;
int n = 10; // antal tal der proppes i array'et
int array[n];
int x;

// putter n tilfældige tal, mellem 0 og 100 i et array.   
  for( i = 0; i < n; i++ )
        array[i] = (rand() % 100);
       
// udskriver usorteret
    printf("usorteret:\n");
    for( i = 0; i < n; i++ )
        printf("%d \n", array[i]);


// udskriver sorteret
    printf("\nsorteret:\n");

int a;
int j;
int smallestId;


for (a = 0; a < n; a++) 
{
  smallestId=a;
    for (j = a + 1; j < n; j++)
      {
        if (array[j] < array[smallestId])
        smallestId=j;
       
        if (smallestId != a)
        swap(array[i], array[smallestId]);
      }
  printf("%d\n", array[a]);


  printf("\n");
  system("pause");
return 0;
}

på forhånd tak!
Avatar billede jpk Nybegynder
27. februar 2007 - 08:59 #1
Din swap-funktion arbejder på lokale variable (call by value)
Du skal lave den så den bruger call by reference, ellers kan den ikke bytte om på tallene:

int d1 // betyder en kopi af d1
int& d1 // betyder referencen til d1

void swap(int& d1, int& d2)
{
  int temp = d1;
  d1 = d2;
  d2 = temp;
}
Avatar billede jpk Nybegynder
27. februar 2007 - 09:00 #2
Hmm, der er også en fejl i kaldet til swap, hvad laver i'et der?:
swap(array[i], array[smallestId]);
Avatar billede ares Nybegynder
27. februar 2007 - 09:10 #3
Hvis jeg udlader min swap og bruger atoi... er der samme problem...

swap(array[i], array[smallestId]); // i angiver hvilken værdi i array'et der skal flyttes på...

ares
Avatar billede jpk Nybegynder
27. februar 2007 - 09:27 #4
atoi??? den konverterer fra text til heltal...

Jeg er udmærket klar over hvordan arrayindeksering virker, men du bruger værdien i som index, det er forkert, jeg går ud fra du vil bruge j?
Avatar billede ares Nybegynder
27. februar 2007 - 09:35 #5
jep... jeg bøjer mig i støvet... j er naturligvis det rigtige... og den sortere også lidt... men ikke ordentlig...
Avatar billede jpk Nybegynder
27. februar 2007 - 09:44 #6
Hmm, det skal vel være a der bruges som index?
swap(array[a], array[smallestId]);
Avatar billede jpk Nybegynder
27. februar 2007 - 09:51 #7
for (a = 0; a < n; a++) 
{
  smallestId=a;
  for (j = a + 1; j < n; j++)
  {
    if (array[j] < array[smallestId])
      smallestId=j;
  }
  // når vi har fundet det mindste, så bytter vi
  if (smallestId != a)
    swap(array[a], array[smallestId]);

  printf("%d\n", array[a]);
}
Avatar billede ares Nybegynder
27. februar 2007 - 09:53 #8
tjaa... det er nu samme problem... hvorfor spytter den nogle gange en tal værdi ud... ala 16384 (er det array's mulige størrelse eller hvad ??)
Avatar billede jpk Nybegynder
27. februar 2007 - 10:26 #9
Nej, det tyder mere på en uinitialiseret variabel...
Er du sikker på, at du har lavet koden nøjagtig som ovenstående?
Avatar billede ares Nybegynder
27. februar 2007 - 10:48 #10
fuck det nu har jeg lavet det således...

// -----------------------------  funktion sortere array'et ----------------
// -------  to parametere array til sortering og størrelsen af array  ------

void sortArray(int array[], int size)
{
    int i = 0;
    while( i < size )
    {
        if( array[i] > array[i + 1] )
        {
            int tmp = array[i];
            array[ i ] = array[i + 1];
            array[i + 1] = tmp;

            i = 0;
        } else {
            i++;
        }
    }
};

// -----------------------------  udskriver usorteret  --------------------
void outUnSort(int* array, int n)
{
int i;
    printf("usorteret:\n");
    for( i = 0; i < n; i++ )
        printf("%d \n", array[i]);
}

// -------------------------------------  main  ----------------------------
int main()
{
int i;
int n = 10; // antal tal der proppes i array'et
int array[n];

// -------------------------------  random til array  -----------------------
// ----------------------  n tilfældige tal stoppes i array  ----------------
  for( i = 0; i < n; i++ )
        array[i] = (rand() % 100);

  outUnSort(array, n);

// ----------------------------------  kald af sort array ------------------
  printf("\nsorteret:\n");
  sortArray(array, n);

  for( i = 0; i < n; i++ )
    printf("%d\n", array[i]);

  printf("\n");
  system("pause");
return 0;
}

Det må gerne kommenteres, er det en fin løsning eller findes der bedre... ??

ares
Avatar billede ares Nybegynder
27. februar 2007 - 10:48 #11
BTW... ovenstående virker... ;)
Avatar billede jpk Nybegynder
27. februar 2007 - 10:53 #12
Dette virker altså hos mig:

#include <stdio.h>
#include <time.h>


// Swap funktion der lægger array'et i rigtig rækkefølge.
void swap(int& d1, int& d2)
{
  int temp = d1;
  d1 = d2;
  d2 = temp;
}

int main()
{
int i;
int n = 10; // antal tal der proppes i array'et
int array[10];

// putter n tilfældige tal, mellem 0 og 100 i et array.
srand((unsigned)time(NULL));
  for( i = 0; i < n; i++ )
        array[i] = (rand() % 100);
       
// udskriver usorteret
    printf("usorteret:\n");
    for( i = 0; i < n; i++ )
        printf("%d \n", array[i]);


// udskriver sorteret
    printf("\nsorteret:\n");

int a;
int j;
int smallestId;


for (a = 0; a < n; a++) 
{
  smallestId=a;
  for (j = a + 1; j < n; j++)
  {
    if (array[j] < array[smallestId])
      smallestId=j;
  }
  if (smallestId != a)
    swap(array[a], array[smallestId]);

  printf("%d\n", array[a]);
}

  printf("\n");
  system("pause");
return 0;
}
Avatar billede jpk Nybegynder
27. februar 2007 - 11:00 #13
Metoden sortArray er mindre effektiv, da du nulstiller og starter forfra igen og igen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester