对于我的编程项目,我应该编写一个程序,对磁盘上的整数进行排序(即离线排序)。我首先要生成一些随机整数,将它们全部写入,然后读取其中两个用于交换的整数,然后将它们写回磁盘,然后重复这些步骤,直到对数字进行排序。我能够很好地生成随机数,打开文件没有问题,但是当尝试写入文件时,它会崩溃。下面是用于实现排序的程序的代码片段,其中包含排序算法,以及使我的程序崩溃的代码段:
void ReadAndWrite(int & rand_ints, int & pos_ints)
{
int rand_ints2 = 0;
GetNumber(pos_ints);
s
我写了一个可以工作的快速排序程序。我需要包含一个计数器来计算迭代次数。在课堂上,我们讨论了算法,并得出结论,元素比较是基本操作。然而,我不知道应该把计数器放在哪里。我似乎不能得到正确的输出。我已经包含了我的代码,谢谢!
void partition( vector<int> & S, int low, int high, int & pivotpoint )
{
vector<int> U;
int pivotitem = S.at(low);
int j = low;
int i;
for( i = low + 1; i <= high; i++
我知道我们可以通过利用尾递归来优化快速排序,方法是删除1个以上的递归调用,并将其减少为一次递归调用: void quickSort(int arr[], int low, int high)
{
if (low < high)
{
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void quickSort(int arr[], int low, int hig
在这两个算法中,你所做的就是把你的结构递归地一分为二,然后以正确的顺序构建你的结构,这样说对吗?
那么,有什么不同呢?
编辑:我找到了在快速排序中实现分区的以下算法,但我并不真正理解它是如何工作的,特别是使用(hi + low) >>> 1作为参数的swop行!有人能理解这一点吗?
private static int partition( int[] items, int lo, int hi )
{
int destination = lo;
swop( items, (hi + lo) >>> 1, hi );
// The
在许多快速排序算法中,编程涉及将每个数组中的元素放入三个组:(less、pivot、more),有时将这些组重新放在一起。如果我不想用这个呢?是否有更简单的方法来手动对列表进行快速排序?
基本上,我计划将数组保持为一体,并根据分区交换所有元素(例如,给定一个list x和pivot r,我们可以得到[0:r]和[r:len(x)]的引用列表。但是,随着排序的继续,我如何继续引用每个较小的“子数组”?
这是我的代码,但我不知道如何继续:
x = [4,7,4,2,4,6,5]
#r is pivot POSITION
r = len(x)-1
i = -1
for a in range(0,r+
我正在尝试理解3向基数快速排序,我不明白为什么那里有截断变量?那插入的方法呢?
public class Quick3string {
private static final int CUTOFF = 15; // cutoff to insertion sort
// sort the array a[] of strings
public static void sort(String[] a) {
// StdRandom.shuffle(a);
sort(a, 0, a.length-1, 0);
as