2015-09-12 87 views
-3

使用Knuth优化的quicksort,其中quicksort在所有分区> k个元素上运行。数组以这种方式部分排序,然后调用单个插入排序来擦亮结果。如何解决这个问题?

使用枢轴= X [随机元素]

给定一个输入文件“的abc.txt”具有以下格式,在数据读取和使用上述的排序排序。第一个数字是要排序的元素的数量。

输入“的abc.txt”是:

11 

8 1 11 2 10 9 3 4 7 6 5 

输出应当与升序数字的行。

这是我的代码,但它不起作用。任何人都可以给我的帮助:

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

void Qsort(int a[], int low, int high) 
{ 
    if(low >= high) 
    { 
     return; 
    } 
    int first = low; 
    int last = high; 
    int key = a[(rand() % (last - first + 1)) + first]; 

    while(first < last) 
    { 
     while(first < last && a[last] >= key) 
     { 
      --last; 
     } 

     a[first] = a[last]; 

     while(first < last && a[first] <= key) 
     { 
      ++first; 
     } 

     a[last] = a[first];  

    } 
    a[first] = key; 
    Qsort(a, low, first-1); 
    Qsort(a, first+1, high); 
} 
int main() 
{ 
    std::fstream myfile("C:\\abc.txt", std::ios_base::in); 
    int y = 0; 

    myfile >> y; 
    int a[100000] = {}; 

    for (int i = 0; i < y; i++) { 
     myfile >> a[i]; 
    } 

    Qsort(a, 0, y-1); 
    for(int i = 0; i < y ; i++) 
    { 
     cout << a[i] << " "; 
    } 
    system("pause"); 
    return 0; 
} 
+1

'std :: sort'很不错。一般来说比DIY解决方案更好,而且工作肯定少。无论如何,我认为这个问题属于代码评论网站,而不是在这里,因为这与语言无关,而且都与执行算法有关。 –

+0

我对这个问题提出了以下改进(不管它是否被移动):(1)详细说明“不工作”,提供示例输入,预期输出,实际输出; (2)对于第一部分,声明它是赋值文本并将其作为块引用,其中有一个按钮,但在每行的开始处基本上是一个'>'; (3)删除没有评论的代码,因为它没有贡献,它只是噪声。 –

+1

你的问题等于“我的代码不起作用”,这是非常不足的。我也不认为你是Angelababy,虽然她很酷。 –

回答

1

最有可能的,你是给myfile不正确的路径。我自己测试了代码,并且它按照我的预期工作。如果我在正确的位置没有abc.txt,程序将运行并且没有输出。我认为这是你正在经历的,虽然“不起作用”是一个含糊不清的东西。

如果您的C:中有abc.txt,我的下一个猜测是您的读取请求被操作系统击落,因为没有正确的权限来访问文件。尝试将文件放入文档文件夹中。

另外,rand位于<cstdlib>,而不是<random>。虽然它似乎<random>将包括<cstdlib>,我不会依赖于此。您还需要将其与srand一起播种,或(作为更好的选择)查看如何使用<random>。起初更复杂,但好得多。

+0

该路径是您的文件所在的位置。假设操作系统像Windows一样有功能,打开“abc.txt”属性并复制完整路径应该可以修复它。只需将每个“\”替换为“\\”,然后使用该路径代替程序中的那个。 –