基本上,我需要阅读一个文本文件并将其插入列表中的ascending order
。
文本文件是,
4 1 9 11 0 15 23 2 7 8 17 21.
我需要将它们放在像
这样的列表中0 1 2 4 7 8 9 11 15 17 21 23
问题是,
将第一项插入空列表。 //这将是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);
}
答案 0 :(得分: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_iterator
s和copy
算法将文件中的整数复制到列表中。
然后
l.sort()
使用list
方法对项目进行排序。
答案 1 :(得分: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();
接下来,创建一个新列表,其中包含已排序的列表。
IList sorted;
sorted.insert(unsorted.get(0), 0); // insert first element
你的作业说要迭代未排序列表中的所有元素。这显然需要一个for循环。您的代码表明您可能对此缺乏经验。请检查控制结构。这些绝对必要。但是,让我帮你解决这个问题。
// 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);
}
}
我没有检查代码是否编译或产生任何运行时错误。但这更多是关于这个概念。希望这有帮助!
最佳, 托马斯