2016-07-25 2 views
2

В принципе, мне нужно прочитать текстовый файл и вставить их в ascending order в список.Как сортировать целые числа и помещать их в список

Текстовой файл,

4 1 9 11 0 15 23 2 7 8 17 21. 

и мне нужно, чтобы поместить их в список как

Проблема говорит,

  • Вставьте первый элемент в пустой список. // Какой будет 4

  • Для каждого последующего элемента:

    If it is smaller than the first item, insert it at position 0.

    Otherwise, scan the list from the beginning, looking for the first

    item whose value is greater than the current value, and insert

    the new item before that one.

Мне кажется, мне нужно сортировать их по сравнению, но я не могу придумать четкую идею. Вы можете мне помочь ?

(Потому что профессор использует свой собственный IList.h и IList.cpp файл, все функции я могу использовать это вставить и удалить.)

=================== ================================================== ====

То, что я попытался было,

#include <iostream> 
#include <fstream> 
using namespace std; 

int main(int argc, char* argv[]) 
{ 


ifstream inf(argv[1]); 
IList t; 
int i1; 
int i2; 
int i3; 
int i4; 
int i5; 
int i6; 
int i7; 
int i8; 
int i9; 
int i10; 
int i11; 
int i12; 

//It is reading each integers from the text file and name it i1, i2, i3.. 
// The text file is.. 
// 4 1 9 11 0 15 23 2 7 8 17 21. 
// i1 is going to be 4 i1 = 4 

inf >> i1 >> i2 >> i3 >> i4 >> i5 >> i6 >> i7 >> i8 >> i9 >> i10 >> i11 
>> i12; 



//I inserted the first value which is 4 
t.insert(i1, 0); 

// comparison will start from here.. 

// when i2 is smaller than i1, we are putting them on the left. 

if ((i2 < i1)) 
{ 
    t.insert(i2, 0); 
} 

// when i2 is greater than i1, we are putting them on the right. 

if ((i2 > i1)) 
{ 
    t.insert(i2, 1); 
} 
+2

Использование массива ('зЬй :: array', или даже массив C) будет решать * все * ваши проблемы :) – Rakete1111

+2

[Или использовать' зЬй :: list'] (http://en.cppreference.com/w/cpp/container/list), как рекомендуют инструкции. – user4581301

+0

Любые конкретные причины использования списка? Вы должны получить все, что хотите бесплатно, используя 'std :: set ' – cplusplusrat

ответ

1

Вы могли бы использовать что-то вроде следующего:

#include <fstream>  
#include <iostream>  
#include <iterator> 
#include <list> 
#include <algorithm> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    ifstream f(argv[1]); 
    istream_iterator<int> b(f); 
    istream_iterator<int> e; 

    list<int> l; 
    copy(b, e, back_inserter(l)); 

    l.sort(); 
    for(auto v: l) 
     cout << v << endl; 
} 

Объяснение

ifstream f(argv[1]); 
    istream_iterator<int> b(f); 
    istream_iterator<int> e; 

    list<int> l; 
    copy(b, e, back_inserter(l)); 

копии целых чисел из файла в список с помощью istream_iterators и алгоритм copy.

Тогда

l.sort() 

сортирует элементы, используя метод list «s.

+0

Если @sungch вручает это, я верю, что его могут спросить, как он пришел к ответу ... –

+0

О, это домашнее задание? Не видел этого. –

+0

Я думаю, что «Проблема говорит» и «Потому что профессор» ее отдает :-) –

0

Алгоритм, который необходимо реализовать, называется «Сортировка вставки». Ознакомьтесь с статьей Википедии: https://en.wikipedia.org/wiki/Insertion_sort для более подробной информации.

В основном это означает, что он помещает первый элемент в список, и для каждого следующего элемента он просматривает список, пока не найдет место, где он принадлежит.

Что бы я делал в первую очередь, это создание списка вместо использования всех этих межсетевых полей (это делает ваш код пригодным для списков с более или менее чем 12 элементами).

// ... 
// read values from file 
IList unsorted; 
while (!inf.eof()) { // checks if end of file is reached 
    unsorted.insert((int)inf.getline()); 
} 
inf.close(); 

Затем создайте новый список, в котором хранится отсортированный список.

Ваше задание говорит о повторении всех элементов в несортированном списке. Это, очевидно, требует для цикла. Ваш код подсказывает, что вы можете быть неопытным. Проверьте контрольные структуры. Это абсолютно необходимо. Но позвольте мне помочь вам.

// for each successive item 
for (int i = 1; i < unsorted.length(); i++) { // maybe there is another method to check unsorted's length ?! 
    int nextValue = unsorted.get(i); 
    j = i; 

    // as long as the current unsorted element is smaller then the previous element in the sorted list, swap these elements 
    while() { 
     int temp = sorted.get(j-1); 
     sorted.insert(temp, j); 
     j--; 
     sorted.insert(nextValue); 
    } 
} 

Я не проверял, компилирует или производит какие-либо ошибки во время выполнения. Но это больше о концепции. Надеюсь это поможет!

Бест, Томас

+0

Большое вам спасибо, сэр. – sungch

+0

, может быть, поставить вопрос как ответ? ;) – Nopeman

Смежные вопросы