Diskuze: 3. a 5. nejmenší prvek pole

C++ C a C++ 3. a 5. nejmenší prvek pole

Avatar
Hadrovej
Neregistrovaný
Avatar
Hadrovej:

Zdravím, prosil bych pomoct, mám zadaný pole a musím z něj dostat 3. a 5. nejmenší prvek a vypsat na jaký je pozici. Zkoušel jsem to dělat pomocí řazení bubble sortem a pak to z toho nák dostat ale nedokážu to ani seřadit :(
takhle mám vytvořený pole
do{
printf("Zadejte velikost pole (min 10,max 500): ");
scanf("%u",&pp);
}
while(pp<10||pp­>500);
for(i=0;i<pp;i++){
pole[i]=rand()%1000;
}

 
Odpovědět 11.5.2013 12:20
Avatar
Michal Žůrek (misaz):

asi bych na to použil dictionry to znamená, že si to tam dáš:
key: index prku
value: hoota z původního pole
no a pak to seřadíš podle value.

Nakonec vypíšeš key od 3. a 5. prvku.

Nahoru Odpovědět 11.5.2013 12:30
Nesnáším {}, proto se jim vyhýbám.
Avatar
Michal Žůrek (misaz):

jo a si si doufám jistý že ten kód cos tu napsal je opravdu c#. :`

Nahoru Odpovědět 11.5.2013 12:31
Nesnáším {}, proto se jim vyhýbám.
Avatar
Hadrovej
Neregistrovaný
Avatar
Hadrovej:

jo je to c :) a Mohl bys mi to prosim tě ukázat v nákým příkladu v kodu já takhle vůbec nevím co to je :) Jestli máš teda čas, nechci otravovat :)

 
Nahoru Odpovědět 11.5.2013 13:04
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Hadrovej
David Čápka:

Bubblesort tu máme samozřejmě vysvětlený i s kódem: http://www.itnetwork.cz/…programovani

Nahoru Odpovědět 11.5.2013 13:26
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Hadrovej
Petr Nymsa:

No první věc, jsi si opravdu jistý že toto je C# ? :) ... každopádně seřaď to například pomocí Select sort algoritmu http://www.itnetwork.cz/…le-velikosti a vypiš 3 a 5 prvek.

Diksuzi přesouvám do správné sekce

Nahoru Odpovědět 11.5.2013 13:28
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Lukáš Hruda (Luckin):

Select sort mi pro pole o maximální velikosti 500 prvků přijde zbytečně složitý, bubble sort, popř. insert sort bohatě postačí. Ale když to pole seřadí, tak už z něj nedostane původní pozice těch dvou prvků.

 
Nahoru Odpovědět 11.5.2013 13:34
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Lukáš Hruda (Luckin)
David Čápka:

Musí si udělat druhé pole, kde bude mít pozice a upravit si třídící algoritmus tak, aby třídil obě naráz. Což nebude složité.

Nahoru Odpovědět 11.5.2013 13:39
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Petr Nymsa:

Až teď čtu zbytek dotazu, no to máš pravdu. Hmm nevím jestli tu existuje něco jako Dictionary, porad ty :D já se odtutd klidím ,akorát budu přihlížet

//EDIT
A nebo to napsal Sdraco, lehčí způsob

Editováno 11.5.2013 13:41
Nahoru Odpovědět 11.5.2013 13:40
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

To je příliš složité, stačí do druhého pole ukládat pointery na prvky místo prvků jako takových. Pak stačí seřadit pointery podle velikostí hodnot na které ukazují a zpětně se z pointeru dá spočítat pozice.

 
Nahoru Odpovědět 11.5.2013 13:47
Avatar
Odpovídá na David Čápka
Lukáš Hruda (Luckin):

Respektive, udělal bych to nějak takhle, připadá mi to nejjednodušší.

#include <stdio.h>

void CopyPointersToArray(int*,int**,int);
void SortPtrArray(int**,int);
int GetPosition(int*,int**,int);

int main()
{
  int size;
  int* arr = NULL;
  int** ptrArr = NULL;
  int i;

  srand(time(0));
  printf("Zadejte velikost pole: ");
  scanf("%d",&size);

  arr = malloc(sizeof(int) * size);
  ptrArr = malloc(sizeof(int*) * size);

  for(i = 0; i < size; i++)
    arr[i] = rand() % 1000;

  CopyPointersToArray(arr,ptrArr,size);
  SortPtrArray(ptrArr,size);

  printf("Vypis pole:\n");
  for(i = 0; i < size; i++)
    printf("%d ",arr[i]);

  printf("\n3. nejmensi prvek je %d a jeho pozice je %d",*ptrArr[2],GetPosition(arr,ptrArr,2));
  printf("\n5. nejmensi prvek je %d a jeho pozice je %d",*ptrArr[4],GetPosition(arr,ptrArr,4));

  getchar();
  getchar();
  free(ptrArr);
  free(arr);
}


void CopyPointersToArray(int* arr, int** ptrArr, int size)
{
  int i;
  for(i = 0; i < size; i++)
    ptrArr[i] = &arr[i];
}

void SortPtrArray(int** ptrArr, int size)
{
  int i, j;
  for(i = 0; i < size; i++)
    for(j = 0; j < size - 1; j++)
      if(*ptrArr[j] > *ptrArr[j + 1])
      {
        int* temp = ptrArr[j];
        ptrArr[j] = ptrArr[j + 1];
        ptrArr[j + 1] = temp;
      }
}

int GetPosition(int* arr, int** ptrArr, int pos)
{
  return ptrArr[pos] - arr;
}

Vstup není ošetřen a pozice se počítá od 0.

 
Nahoru Odpovědět 11.5.2013 14:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.