我正在尝试在一个大文本文件上写一个冒泡排序,该文件有1列数字,它们都在1到99之间。我想对它进行排序,而不是同时将内容或数据放在内存中。在我对整个文件执行此操作之前,我使用了20次循环来获取逻辑。我使用streamreader和streamwriter来回接收和发送数字,因此任何时候只处理2个数字。文本文件中的数字编码为int32。我在写入过程中对它们进行了转换。我无法填充"已排序"带有数据的文件。这是我的代码:
static void BubbleSort()
{
int bubbleOut, bubbleIn;
StreamReader readToSort = new StreamReader(@"C:Random # File.txt");
StreamWriter writeSorted = new StreamWriter(@"C:Sorted_File.txt");
bubbleIn = readToSort.Read();
bubbleOut = readToSort.Read();
for (bubbleIn = 1; bubbleIn <= 20; bubbleIn++)
{
for (bubbleOut = bubbleIn; bubbleIn < bubbleOut; bubbleOut++ )
{
if (bubbleOut > bubbleIn)
{
int temp = bubbleIn;
bubbleIn = bubbleOut;
bubbleOut = temp;
writeSorted.WriteLine(bubbleIn);
writeSorted.WriteLine(bubbleOut);
}
}
}
}
答案 0 :(得分:0)
首先,对于大型数据集,最好使用MergeSort,因为它比BubbleSort(O(n log n)
)快得多(O(n * n)
)。
除此之外,您只读取输入流的前两个字符,并在读取数据后,覆盖for循环中的值。
我认为你首先必须将输入文件的全部内容复制到输出文件中。然后,您需要一种方法在输出流中交换2个字符。之后,您可以在inputfile上运行bubblesort算法并在输出文件上应用swap。
你的for循环应该类似于:
// TODO: Copy input to output
for (int sortedElement = 0; sortedElement < StreamLength; sortedElement++)
{
// You don't have to loop till the end of the stream. Last
// character is sorted on each iteration.
for (int index = 0; index < StreamLength - sortedElements - 1; index++)
{
// read character from input stream at position 'index' as leftValue
// read character from input stream at position 'index+1' as rightValue
if (rightValue < leftValue)
{
// Perform swap values in outputfile
}
}
}
应该是它。