- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我引用了clrs算法导论的归并排序算法,用C语言写了一个程序。虽然我用笔和纸手动检查了它,但代码似乎是正确的,但我也没有得到正确的输出。
输出如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void merge(int array[], int start, int middle, int end) {
int n1 = middle - start + 1;
int n2 = end - start;
int i;
int leftarray[n1 + 1], rightarray[n2 + 1];
for (i = 0; i < n1; i++) {
leftarray[i] = array[start + i];
}
for (int j = 0; i < n2; i++) {
rightarray[j] = array[middle + j + 1];
}
leftarray[n1 + 1] = 1000000;
rightarray[n2 + 1] = 1000000;
int k, j = 0;
i = 0;
for (k = start; k <= end; k++) {
if (leftarray[i] > rightarray[j]) {
array[k] = rightarray[j];
j++;
} else {
array[k] = leftarray[i];
i++;
}
}
}
void mergeSort(int array[], int start, int end) {
if (start < end) {
int middle = (start + end) / 2;
mergeSort(array, start, middle);
mergeSort(array, middle + 1, end);
merge(array, start, middle, end);
}
}
void sorting(int array[], int length) {
int i;
for (i = 0; i < length; i++) {
printf("%d ", array[i]);
}
}
int main() {
int noOfelements;
scanf("%d", &noOfelements);
int array[noOfelements];
for (int i = 0; i < noOfelements; i++) {
scanf("%d", &array[i]);
}
printf("Before Sorting: ");
sorting(array, noOfelements);
mergeSort(array, 0, noOfelements - 1);
printf("After Sorting: ");
sorting(array, noOfelements);
return 0;
}
上述程序的输出:
5
5 4 3 2 1
Before Sorting: 5 4 3 2 1 After Sorting: 2 0 5 0 32
最佳答案
尽管 Thomas H Cormen、Charles E Leiserson、Ronald L Rivest 和 Clifford Stein 所著的算法导论一书被认为是一本优秀的教科书,但您实现的算法有几个缺点:
end
作为数组中最后一个元素的索引:使用 end
作为数组后第一个元素的索引会简单得多,因此消除了混淆 +1
/-1
调整的需要,并允许空数组。int middle = (start + end)/2;
这可能会溢出 start
和 end
的大值,尽管其他如果您尝试对如此庞大的数组进行排序,您的部分实现将会失败。还是写 int middle = start + (end - start)/2;
您的代码失败是因为您将标记值设置得太远了。你应该写:
leftarray[n1] = 1000000;
rightarray[n2] = 1000000;
这里有一个更好的方法:
#include <stdio.h>
void merge(int array[], int start, int middle, int end) {
int n1 = middle - start;
int i, j, k;
// save the elements from the left half, no need to save the right half
int leftarray[n1];
for (i = 0; i < n1; i++) {
leftarray[i] = array[start + i];
}
for (i = 0, j = middle, k = start; i < n1; k++) {
if (j >= end || leftarray[i] <= array[j]) {
array[k] = leftarray[i];
i++;
} else {
array[k] = array[j];
j++;
}
}
}
void mergeSort(int array[], int start, int end) {
if (end - start >= 2) {
int middle = start + (end - start) / 2;
if (middle - start > 100000) {
// avoid stack overflow: allocate at most 100k ints for `leftarray`
middle = start + 100000;
}
mergeSort(array, start, middle);
mergeSort(array, middle, end);
merge(array, start, middle, end);
}
}
void print_array(const char *prefix, const int array[], int length) {
printf("%s:", prefix);
for (int i = 0; i < length; i++) {
printf(" %d", array[i]);
}
printf("\n");
}
int main() {
int noOfelements;
if (scanf("%d", &noOfelements) != 1 || noOfelements < 0)
return 1;
int array[noOfelements];
for (int i = 0; i < noOfelements; i++) {
if (scanf("%d", &array[i]) != 1)
return 1;
}
print_array("Before Sorting", array, noOfelements);
mergeSort(array, 0, noOfelements);
print_array("After Sorting", array, noOfelements);
return 0;
}
关于c - 我写了一个 mergeSort 代码(来自 clrs 书)但没有得到输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66500000/
我正在根据 CLRS 用 C 实现堆排序算法。但是我无法获得排序的输出。您能看一下并告诉我我的代码有什么问题吗?函数 maxheap 和 buildmaxheap 有效。我无法弄清楚代码有什么问题。
我正在尝试 CLRS 中给出的 QuickSort 实现,但它给出了数组索引越界异常。以下是方法。从 main 调用数组,随机生成 10 个元素的数组。 public static String qu
我使用 CLRS 作为对算法的介绍。我正在尝试用 Python 实现书中用伪代码编写的算法。但是,我遇到了问题,因为这本书从 1 开始索引。这就是我实现合并排序的方式,但它无法正常工作: def Me
我正在尝试解决这个问题(CLRS,第 3 版,练习 11.2-1): Suppose we use a hash function h to hash n distinct keys into an
我在 page 47 上看到这段话的 Introduction to Algorithms by Cormen et al. : The number of anonymous functions i
这是我正在寻找答案的问题: 数组 A[1...n] 包含从 0 到 n 除了 1 之外的所有整数。很容易确定丢失的O(n) 时间内的整数通过使用辅助数组 B[0...n] 来记录哪些数字出现在 A 中
我目前正在通过 CLRS 并有一个快速问题。顶点相等性是如何定义的?我遇到了 的问题和 . u != v 是否意味着 u 和 v 不相邻?我认为这只是暗示 u 和 v 不是指同一个顶点?难道 u 和
我正在尝试实现经典 CLRS 书中给出的快速排序算法。我已经在我的 C# 程序中完全逐行实现了它。但是输出是未排序的。以下是我的完整代码以及输出: using System; namespace cl
这是 CLRS 问题。问题来自 CLRS 书的第三版:5-2-b。 随机搜索是一种算法,您必须随机选择一个元素并将其与搜索到的元素进行比较。如果等于,我们需要停止。现在,假设您正好有一个索引为 i 的
我是一名自学计算机科学专业的学生。现在我正在阅读 CLRS,我做了 2.2-2 练习,它是关于选择排序的。 First array subscript is 1. 我写的伪代码是: FOR i=1 t
您好,我正在阅读有关 CLRS 通用哈希的章节。 第 234 页 推论 11.4 Using universal hashing and collision resolution by chainin
不确定我是否应该把它放在 math stackexchange 上,但是哦,好吧。 在 CLRS 第 300 页... Theorem 12.4 The expected height of a ra
我最近试图通过 CLRS 求解一些递归关系,并且在求解这些方程时我注意到了一个奇怪的细微差别。我不知道你们中的任何人是否注意到它,或者理论冠军可以对此进行更多说明。 (我也拥有计算机科学学位,但没有理
我正在尝试在java中实现合并排序,并且我已经按照CLRS书中给出的算法编写了代码。当我尝试运行代码时,我继续遇到数组越界异常。老实说,我不明白我在这里犯了什么错误。 package mergesor
我目前正在阅读 CLRS 的算法导论的第二章,我遇到了一个奇怪的练习。它要求我对插入排序进行排序,以便不增加而不是减少。 所以我假设对于一个给定的数组 A = { 91, 23, 24 ,54, 23
CLRS - Introduction to Algorithms 中的定理 22.10说是 In a depth first search of an undirected graph G, eve
对于“切杆”问题: Given a rod of length n inches and an array of prices that contains prices of all pieces o
我正在尝试从 clrs 书中实现队列,但它没有按预期工作。我的代码有什么问题? 会不会是队列大小或入队操作的问题? 但是,很明显队列上的入队操作没有按预期工作。这是我的代码: class Queue:
我正在尝试在 python 中实现快速排序。 CLRS算法版本。 这是我写的。我认为除了列表的中间元素外,它在大多数情况下都运行良好。 有人可以帮忙吗? #! /usr/bin/python #qui
我一直在阅读 Introduction To Algorithms 中的 Rabin Karp 算法。除以下内容外,一切都有意义。 In general, with a d-ary alphabet
我是一名优秀的程序员,十分优秀!