- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我尝试使用指针在 C 中编写合并排序算法(我是指针的新手)。我使用了 static int n
(n = 元素数)和 v
(元素数组)。 mergeSort算法后,每次用随机数修改n
值。我做错了什么?
这里我读取了输入
int *v = malloc(NMAX * sizeof(int));
int n;
scanf("%d", &n);
int i;
for (i = 0; i < n; ++i) {
scanf("%d", &v[i]);
}
这是合并排序算法:
void mergeSort(int st, int dr, int *v) {
if (st < dr) {
int mij = (st + dr) / 2;
mergeSort(st, mij, &v);
mergeSort(mij + 1, dr, &v);
mergeElements(st, dr, &v);
}
}
void mergeElements(int st, int dr, int *v) {
int *auxArray = malloc((dr - st + 3) * sizeof(int));
int pos = 0;
int sPos = st;
int mij = (st + dr) / 2;
int dPos = mij + 1;
for (pos = 0; pos < (dr - st + 1); ++pos) {
if (dPos == dr + 1) {
auxArray[pos] = v[sPos];
sPos++;
} else if (sPos == mij + 1) {
auxArray[pos] = v[dPos];
dPos++;
} else {
if (v[sPos] < v[dPos]) {
auxArray[pos] = v[sPos];
sPos++;
} else {
auxArray[pos] = v[dPos];
dPos++;
}
}
}
int i;
for (i = 0; i < pos; ++i) {
v[st + i] = auxArray[i];
}
free(auxArray);
}
这是我出错的地方(在 main
中):
mergeSort(0, n - 1, &v);
printf("%d", n);
我得到的 n
是 1998609340
而不是 6
。
编辑:这是我打印元素的地方:
for (i = 0; i < n; ++i) {
printf("%d ", v[i]);
}
最佳答案
&v 不应在您对 mergeSort 和 mergeElement 的调用中传递。&v 实际上是 int** 类型 而你的函数原型(prototype)支持 int *。(编译代码时一定有警告)
嘿,这是调试后的代码(只是在调用 mergeSort & mergeElements 时将 &v 改回 v)
#include<stdio.h>
#include<stdlib.h>
#define NMAX 1000
void mergeElements(int st, int dr, int *v);
void mergeSort(int st, int dr, int *v) {
if (st < dr) {
int mij = ( st + dr ) / 2;
mergeSort(st, mij, v);
mergeSort(mij + 1, dr, v);
mergeElements(st, dr, v);
}
}
void mergeElements(int st, int dr, int *v) {
int *auxArray = malloc( (dr - st + 3) * sizeof(int) );
int pos = 0;
int sPos = st;
int mij = ( st + dr ) / 2;
int dPos = mij + 1;
for (pos = 0; pos < (dr - st + 1); ++pos) {
if (dPos == dr + 1) {
auxArray[pos] = v[sPos];
sPos ++;
} else if (sPos == mij + 1) {
auxArray[pos] = v[dPos];
dPos ++;
} else {
if (v[sPos] < v[dPos] ) {
auxArray[pos] = v[sPos];
sPos ++;
} else {
auxArray[pos] = v[dPos];
dPos ++;
}
}
}
int i;
for (i = 0; i < pos; ++i) {
v[st + i] = auxArray[i];
}
free(auxArray);
}
int main()
{
int *v = malloc( NMAX * sizeof(int) );
int n;
scanf("%d", &n);
int i;
for (i = 0; i < n; ++i) {
scanf("%d", &v[i]);
}
mergeSort(0,n-1,v);
for(int i=0;i<n;i++)
{
printf("%d ",v[i]);
}
printf("\n");
}
关于c - c 中的指针更改 static int 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53024628/
我是 F# 的菜鸟,目前正在阅读 F# 3.0 中的专家。 它是我学习的第一种编译语言(我只知道用 R 编程) 在第 6 章第 117 页,我们没有太多仪式性地介绍 静态让和静态成员。我真的不明白它是
我很迷茫。我已经花几个小时广泛地复习了我的两个类(class)。没有什么是静态的,没有什么是静态引用的,但我无法摆脱这个错误。 A 类文件 (ClassA.php) privateVariable =
关于类公共(public)类声明,请看这两段代码: public class Helper { public static void CallMeganFox(string phoneNumb
我如何使用“super”关键字从父类(super class)(类“aa”)引用“a1” class aa { protected static int a1 = 2; } public class
class Perkusja { boolean talerze = true; boolean beben = true; void zagrajNaBebnie() { Sys
我试图在编译 C++ 程序时静态链接库。 g++ (GCC) 4.8.5 20150623(红帽 4.8.5-4) $ g++ -std=c++11 -I/home/jerry/Desktop/tin
$ javac TestFilter.java TestFilter.java:19: non-static variable this cannot be referenced from a sta
这个问题在这里已经有了答案: How do I create a global, mutable singleton? (7 个答案) How can you make a safe static
“覆盖”静态数组时我遇到了一个棘手的问题。我有静态数组(为简单起见),它们在不同的派生类中具有固定长度,但在编译时仍然知道所有大小。我在基类中也有一个虚函数,但我不知道如何解决在派生类中覆盖这些数组和
我刚刚在遗留代码中发现了这一点。我知道使用宏,每当使用名称时,它都会被宏的内容替换。它们最常用于为数字常量提供符号名称。我所知道的是预处理没有类型安全、范围的概念。 这样做的真正好处是什么? #def
将 Singleton 实例声明为 static 还是声明为 static final 更好? 请看下面的例子: 静态版本 public class Singleton { private s
问题: 我观察到的行为是 TypeScript 的预期行为吗? 我观察到的行为是 ECMAScript 6 的预期行为吗? 是否有一种简单的方法可以返回继承层次结构以处理每个级别的“myStatic”
在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/functi
我尝试向 ExpandoObject 添加一个动态方法,该方法会返回属性(动态添加)给它,但它总是给我错误。 我在这里做错了吗? using System; using System.Collecti
我试图获得一个静态链接到我的程序的音频库。我用 this灵活的包。为了让它运行,我必须按照描述构建 soloud 库 here .下载后不久,我在“build”文件夹中运行了“genie --with
这是我的webpack.prod.config.js代码 const path = require('path'); const { CleanWebpackPlugin } = require('c
我想知道什么时候应该对变量和(或)方法使用静态、最终、静态最终参数。据我了解: final:类似于c++中的const参数。它基本上意味着值(或在方法中 - 返回值)不会改变。 静态:这意味着值(或方
我一直在阅读有关使用静态对象作为锁的内容,最常见的示例如下: public class MyClass1 { private static final Object lock = new Obje
在 Visual Basic 2008 中,我知道有两种不同的方法可以完成同一件事: 成员(member)级别的 Dim: Dim counter1 as integer = 0 Dim counte
static public final int i = 0; public static final int i = 0; 两者都工作正常。 为什么同样的事情可以用两种不同的风格来完成? 最佳答案 因
我是一名优秀的程序员,十分优秀!