如何修复此排序?
How to fix this sorting?
使用 Knuth 优化的快速排序,其中快速排序对所有分区 > k 元素进行操作。这样对数组进行了部分排序,然后调用单次插入排序对结果进行润色
使用pivot = 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;
}
很可能,您给 myfile
的路径不正确。我自己测试了代码,它按我预期的那样工作。如果我在正确的位置没有 abc.txt
,程序将 运行 并且没有输出。我想这就是您遇到的情况,尽管 "does not work" 有点含糊。
如果您在 C:
中确实有一个 abc.txt
,我的下一个猜测是您的读取请求被 OS 击落,因为没有正确的权限来访问那里的文件.尝试将文件放入您的文档文件夹中。
此外,rand
位于 <cstdlib>
,而不是 <random>
。虽然看起来 <random>
肯定会包含 <cstdlib>
,但我不会依赖它。您还需要使用 srand
作为种子,或者(作为更好的选择)研究如何使用 <random>
。一开始比较复杂,但是好多了。
使用 Knuth 优化的快速排序,其中快速排序对所有分区 > k 元素进行操作。这样对数组进行了部分排序,然后调用单次插入排序对结果进行润色
使用pivot = 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;
}
很可能,您给 myfile
的路径不正确。我自己测试了代码,它按我预期的那样工作。如果我在正确的位置没有 abc.txt
,程序将 运行 并且没有输出。我想这就是您遇到的情况,尽管 "does not work" 有点含糊。
如果您在 C:
中确实有一个 abc.txt
,我的下一个猜测是您的读取请求被 OS 击落,因为没有正确的权限来访问那里的文件.尝试将文件放入您的文档文件夹中。
此外,rand
位于 <cstdlib>
,而不是 <random>
。虽然看起来 <random>
肯定会包含 <cstdlib>
,但我不会依赖它。您还需要使用 srand
作为种子,或者(作为更好的选择)研究如何使用 <random>
。一开始比较复杂,但是好多了。