使用文件本身作为容器对文本文件进行冒泡排序

时间:2015-04-02 05:52:10

标签: c# file sorting streamreader

我正在尝试在一个大文本文件上写一个冒泡排序,该文件有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);
                }
            }
        }
}

1 个答案:

答案 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
       }
   }
}

应该是它。