Avatar billede fritznikos Nybegynder
21. februar 2006 - 10:30 Der er 17 kommentarer og
2 løsninger

hjælp til talsortering i c++

Hej, jeg er i gang med lave et program der skal kunne sortere tal i en rækkefølge, således at de mindste tal skal være de første i rækkefølgen. (f.eks. 10 – 5 – 1 – 1000, skal sorteres til 1 – 5  - 10 – 1000)
Det meste af programmet er lavet, men mangler de sidste ting som jeg ikke helt kan finde ud af, er det noget i kan  hjælpe med?

Måske skal man benytte bubblesort metoden, har dog ingen erfaring med det, c++ er meget nyt for mig..
Her ses koden:
--------------------------------------------------------
#include <cstdlib>
#include <iostream>

using namespace std;
int main()
{
    int tal[10];
    int start = 0;
    int check = 1;
    int tmp;
    int n = 10;
    int i;
   
   
    tal[0] = 833;
    tal[1] = 277;
    tal[2] = 18397;
    tal[3] = 10;
    tal[4] = 5;
    tal[5] = 6290;
    tal[6] = 2882;
    tal[7] = 32;
    tal[8] = 22;
    tal[9] = 2900;
   
    {       
    for (i = 0; i << n; i++)
   
   
   
   
   
   
   
   
    int tmp = tal[start];
    tal[start] = tal[check];
    tal[check]=tmp;
   
   
   
    cout << tal[i] << ' ';
    }
}
Avatar billede mollevp Nybegynder
21. februar 2006 - 10:52 #1
#include <cstdlib>
#include <iostream>

using namespace std;

void bubbleSort1(int x[], int n);

int main()
{
    int tal[10];
    int start = 0;
    int check = 1;
    int tmp;
    int n = 10;
    int i;


    tal[0] = 833;
    tal[1] = 277;
    tal[2] = 18397;
    tal[3] = 10;
    tal[4] = 5;
    tal[5] = 6290;
    tal[6] = 2882;
    tal[7] = 32;
    tal[8] = 22;
    tal[9] = 2900;

    bubbleSort1(tal, n);

    for(int i = 0; i < n; ++i)
        cout << tal[i] << ' ';

    return 0;
}
void bubbleSort1(int x[], int n) {
    for (int pass=1; pass < n; pass++) {  // count how many times
        // This next loop becomes shorter and shorter
        for (int i=0; i < n-pass; i++) {
            if (x[i] > x[i+1]) {
                // exchange elements
                int temp = x[i]; x[i] = x[i+1]; x[i+1] = temp;
            }
        }
    }
}
Avatar billede jpk Nybegynder
21. februar 2006 - 10:52 #2
Hvad med dette:

int main()
{
    int tal[10];
    int check;
    int tmp;
    int n = 10;

    tal[0] = 833;
    tal[1] = 277;
    tal[2] = 18397;
    tal[3] = 10;
    tal[4] = 5;
    tal[5] = 6290;
    tal[6] = 2882;
    tal[7] = 32;
    tal[8] = 22;
    tal[9] = 2900;

    while(check) {
        check = 0;
        for(int i=0; i<n-1; ++i) {
            if(tal[i] > tal[i+1]){
                tmp = tal[i];
                tal[i] = tal[i+1];
                tal[i+1] = tmp;
                ++i;
                check = 1;
            }
        }
    }
}
Avatar billede fritznikos Nybegynder
21. februar 2006 - 11:21 #3
Mange tak for jeres svar, mollevp-> selve programmet virker og kan sortere tallene i en rigtig rækkefølge.
jkp-> Kan se der ingen cout er, har prøvet at tilføje cout, men rækkefølgen ser ikke helt rigtigt ud. Har du mulighed for at finde fejlen ? for vil meget gerne benytte begge eksempler..
Avatar billede msor Nybegynder
21. februar 2006 - 11:22 #4
Jeg sad og prøvede noget lignende igår, dog med en vector og ikke et array. Jeg fandt frem til sort-algorithmen, måske du kan bruge noget af min kode. Den gemmer tallene, brugeren taste i s, indtil det ikke er en gyldig double-værdi:

#include <vector>
#include <iostream>
#include <algorithm>

int main()
{
    std::vector<double> s;
    double d, i;
   
    while(std::cin >> d) {
        s.push_back(d);
        ++i; // will be used to print highest value
    }
   
    // sort the values we got   
    std::sort(s.begin(), s.end());
   
    std::cout << "Smallest value: " << s[0] << std::endl;
    std::cout << "Highest value: " << s[i] << std::endl;
}

Hvis du vil printe allle værdier, der kommer ind, kan du bare lave linie 13 og 14 om til en løkke...
Avatar billede jpk Nybegynder
21. februar 2006 - 11:32 #5
Har lige prøvet at køre det, det ser ud til at give den rigtige rækkefølge..?
Havde dog lige glemt at initialisere check variablen.

int main()
{
    int tal[10];
    int check=1;
    int tmp;
    int n = 10;

    tal[0] = 833;
    tal[1] = 277;
    tal[2] = 18397;
    tal[3] = 10;
    tal[4] = 5;
    tal[5] = 6290;
    tal[6] = 2882;
    tal[7] = 32;
    tal[8] = 22;
    tal[9] = 2900;

    while(check) {
        check = 0;
        for(int i=0; i<n-1; ++i) {
            if(tal[i] > tal[i+1]){
                tmp = tal[i];
                tal[i] = tal[i+1];
                tal[i+1] = tmp;
                ++i;
                check = 1;
            }
        }
    }

    for(int i=0; i<n; ++i) {
        cout << tal[i] << endl;
    }
    cin.get();
}
Avatar billede fritznikos Nybegynder
21. februar 2006 - 11:57 #6
i skal have mange tak, som jeg skrev før er prgrammering rimelig nyt for mig, kan i evt. forklare algoritmen, se vengligst flg. link->
http://www.alarmbasen.dk/cplus.bmp
Avatar billede msor Nybegynder
21. februar 2006 - 12:11 #7
Det er såmænd temmelig enkelt, std::sort(s.begin(), s.end()); starter med at sortere fra s.begin() og slutter ved s.end(), og så ændrer den på positionerne i vectoren, så det mindste tal ligger i s[0], og det største i s[size-1].
Avatar billede jpk Nybegynder
21. februar 2006 - 12:36 #8
std::sort benytter dog ikke bubble sort, men quick sort.
Avatar billede fritznikos Nybegynder
21. februar 2006 - 12:53 #9
oki, jpk-> hvor mange gennemløb laver det program du har lavet ? evt. en lille forklaring af hvad der sker i programmet ?
Avatar billede jpk Nybegynder
21. februar 2006 - 12:59 #10
int main()
{
    int tal[10];
    int check=1;
    int tmp;
    int n = 10;
    int loops = 0;

    tal[0] = 833;
    tal[1] = 277;
    tal[2] = 18397;
    tal[3] = 10;
    tal[4] = 5;
    tal[5] = 6290;
    tal[6] = 2882;
    tal[7] = 32;
    tal[8] = 22;
    tal[9] = 2900;

    while(check) {
        ++loops;
        check = 0;
        for(int i=0; i<n-1; ++i) {
            if(tal[i] > tal[i+1]){
                tmp = tal[i];
                tal[i] = tal[i+1];
                tal[i+1] = tmp;
                ++i;
                check = 1;
            }
        }
    }

    for(int i=0; i<n; ++i) {
        cout << tal[i] << endl;
    }
    cout << "Loops: " << loops << endl;
    cin.get();
}
Avatar billede jpk Nybegynder
21. februar 2006 - 13:06 #11
while(check) { // Sålænge 2 tal er blevet byttet rundt
        ++loops; // Tæl antallet af gennemløb op
        check = 0; // Nulstil
        for(int i=0; i<n-1; ++i) { // For hver element i listen
            if(tal[i] > tal[i+1]){ // Hvis det første tal er større end det næste (sammenligner først 1 og 2, så 2 og 3, så 3 og 4 osv.)
                tmp = tal[i]; // Byt tallene (denne + 2 næste linier)
                tal[i] = tal[i+1];
                tal[i+1] = tmp;
                ++i; // FJERN DENNE LINIE, DET VAR EN FEJL
                check = 1; // Sæt et flag betydende at vi har byttet 2 tal (altså at der måske stadig er tal der skal byttes)
            }
        }
    }
Avatar billede jpk Nybegynder
21. februar 2006 - 13:07 #12
Det giver 7 gennemløb...
Avatar billede fritznikos Nybegynder
21. februar 2006 - 13:14 #13
oki mange takker..
Jpk du får 150 point - mollevp du får resterende points(50p) kom venligst med et svar..
Avatar billede mollevp Nybegynder
21. februar 2006 - 16:20 #14
svar
Avatar billede fritznikos Nybegynder
22. februar 2006 - 11:45 #15
jpk-> hvilken sorteringsalgoritem benytter den kode du har lavegt ? tror ikke helt det kan passe med kun 7 gennemløb, hvis det var tilfældet vil den ikke kunne sortere tallene i den rigtige rækkefølge...
Avatar billede jpk Nybegynder
22. februar 2006 - 11:57 #16
Det er en bubble sort.
Der er 7 gennemløb i yderste loop og 63 i inderste...
Avatar billede rif1900 Nybegynder
26. februar 2006 - 19:55 #17
en skam de point er givet ud det problem skal sq løses rekursivt :)
Avatar billede rif1900 Nybegynder
26. februar 2006 - 21:37 #18
for lige en kammi til at smide den rekusive løsning
Avatar billede fiil123 Nybegynder
26. februar 2006 - 21:41 #19
Rekusive løsning

#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

void mergesort(int [], int);

void merge(int [], int , int );

void main(){
int data[8];

for(int i=0; i<8; i++){
        data[i]=rand();
        cout << data[i] << endl;
}
getch();
    mergesort(data,8);
getch();

for(int q=0; q<8; q++){
    cout << data[q] << endl;
}



}

void mergesort(int data[], int n)

{
    int n1;
    int n2;

    if( n > 1)
    {
        n1 =  n / 2;
        n2 = n - n1;

        mergesort(data, n1);
        mergesort((data + n1), n2);

        merge(data, n1, n2);
    }
}


void merge(int data[], int n1, int n2)
{
int copyN1 = 0; // Tæller til at holde styr på hvor vi er i n1 delen af array Data
int copyN2 = 0; // Tæller til at holde styr på hvor vi er i n2 delen af array Data
int copy = 0;    // Tæller til at holde styr på hvor vi er i array Temp
int *temp;
temp = new int [n1+n2];

while( ( copyN1 < n1 ) && ( copyN2 < n2 ) )
{
    if( data[copyN1] < (data+n1)[copyN2] )
        temp[copy++] = data[copyN1++];
    else
        temp[copy++] = (data+n1)[copyN2++];
}

while(copyN1 < n1)
    temp[copy++] = data[copyN1++];

while(copyN2 < n2)
    temp[copy++] = (data+n1)[copyN2++];

for(int i=0; i < n1+n2; i++)
    data[i]=temp[i];

delete [] temp;

}
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