2013-09-10 3 views
0

У меня есть эта функция под названием WordSort (worddata W [], int count), которая снабжается двумя переменными 1 - worddata - это массив, содержащий информацию о данном слове в файле. count - это просто переменная счетчика, чтобы увидеть, какое слово в массиве мы рассматриваем.C++ inserting sort

Файл words.txt, который считывается в эту программу, будет просто строкой слов.

this is a list of words 
there are letters and numbers 
23 people recommend this program. 

Heres функция:

void WordSort (worddata W [], int count) 
{ 
    for (int i=1; i < count; i++) 
     { 
      for (int j=i; j > 0 && W[j-1].word > W[j].word; j--) 
      { 
       Swap(W[j], W[j-1]); 
      } 
     } 
} 

Функция замены предполагают, чтобы поменять каждый элемент с одним перед ним до тех пор, как J> 0 или список заканчивается. Я запутался в том, как завершить функцию подкачки, вот пример, который я дал.

void Swap (worddata & a, worddata & b) 
{ 
int += a; 
a = b; 
b =+; 
} 

Своп предполагают, чтобы поменять каждый элемент с одним, прежде чем

Я думаю, что функция WordSort работает отлично, единственное, что отсутствует функция подкачки. Может ли кто-нибудь указать мне в правильном направлении или объяснить сортировку вставки лучше для меня?

+0

Вы можете привести пример слов? что ожидается результат? – 4pie0

+6

'int + = a;' и 'b = +;' недопустимы код C++. И разве это не пузырь? –

+0

- это настоящий код? он компилируется? – 4pie0

ответ

0

Swap должен выглядеть так: я не знаю, как ваш пример даже близко.

void Swap (worddata & a, worddata & b) 
{ 
worddata temp = a; 
a = b; 
b = temp; 
} 
+0

Можете ли вы объяснить, почему worddata должен идти перед temp? Я пробовал это без него, и он не будет компилировать – nastalgia

+0

Поскольку вам нужна «локальная» переменная, это объявление «temp» как локальная переменная, в которой вы будете хранить «a», и, конечно, worddata - это тип данных ... обратите внимание, что, возможно, «wordata» отличается от int – FacundoGFlores

+0

@nastalgia, если это не скомпилировано, скорее всего, «worddata» не поддерживает ни построение копии, ни оператор присваивания (или оба?). В противном случае это должно правильно компилироваться. – WhozCraig

1

Использовать стандартную библиотеку std::swap. В вашем цикле:

for (...) 
{ 
    std:swap(W[j], W[j-1]); 
} 

станд :: своп требует класс worddata иметь конструктор копирования и оператор присваивания, определенный явно или неявно.

1
void insertion_sort() 
{ 


    /* Algorithm : Insertion Sort 
    * Coded by . 
    */ 
    int num; 
    /* 
    * Asking the User no of Integers he/she wants to enter 
    */ 
    cout << "Enter no of integers u want to enter: "; 
    cin >> num; 
    /* Creating an Array to store the integers*/ 
    int s[num]; 
    /*Taking Integers from the User */ 
    for(int i = 0 ; i < num ; i++) 
    { 
     cout << "Integer " << i+1 << " is : "; 
     int x; 
     cin >> x; 
     s[i] = x; 
    } 
    /* The Magic of INSERTION SORT */ 
    for(int j = 1 ; j <= (num-1) ; j++) 
    { 
     int key = s[j]; 
     int k = j-1; 

     while(k >=0 && key <= s[k]) 
     { 
      s[k+1] = s[k]; 
      k = k - 1; 
     } 
     s[k+1]=key; 

    } 
    /*Printing Out the Sorted List */ 
    cout << "The Sorted List is \n\n"; 
    for(int i = 0 ; i < num ; i++) 
    { 
     cout << s[i] << " "; 
    } 

} 
+0

Интересно, массив определяется от 0 до num, но мы итерации от 1 до num-1.Активировано, потому что отверстие в k = j -1, когда j равно нулю, подключено, но работает ли оно для целых чисел +1? –