Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在尝试实现HeapSort_C++_C_Algorithm_Heap_Heapsort - Fatal编程技术网

C++ 正在尝试实现HeapSort

C++ 正在尝试实现HeapSort,c++,c,algorithm,heap,heapsort,C++,C,Algorithm,Heap,Heapsort,我被希普索尔卡住了。我有一些代码,但我认为它是非常错误的,因为我有困难的时间编译它。有什么建议吗?堆排序应该很容易实现,但我有很多语法错误。这是我的密码: /* Framework for Heap Sort * CS333 Spring 2011 * */ #include <stdio.h> #define MAX_SIZE 1000000 int data[MAX_SIZE]; int n; int j; int parent(int j) { if(j==1)

我被希普索尔卡住了。我有一些代码,但我认为它是非常错误的,因为我有困难的时间编译它。有什么建议吗?堆排序应该很容易实现,但我有很多语法错误。这是我的密码:

/* Framework for Heap Sort
 * CS333 Spring 2011
 * 
 */
#include <stdio.h>
#define MAX_SIZE 1000000
int data[MAX_SIZE];
int n;
int j;

int parent(int j) {
if(j==1)
    return 0;

if(j%2==0)
    return ( (j / 2)-1);
else
    return ( (j / 2));
}

int left(int j) {
  return (2 * j) + 1;
}

int right(int j) {
  return (2 * j) + 2;
}

void heapify(int data[], int j) {
  int l = left(j), great;
  int r = right(j);
  if ( (data[l] > data[j]) && (l < sizeof(data))) {
    great = l;
  }
  else {
    great = j;
  }
  if ( (data[r] > data[great]) && (r < sizeof(data))) {
    great = r;
  }
  if (great != j) {
    int temp = data[j];
    data[j] = data[great];
    data[great] = temp;
    heapify(data, great);
  }
}

int BuildMaxHeap(int data[]) {
  for (int j = (sizeof(data) - 1) / 2; j >= 0; j--) {
    heapify(data, j);
    return data;
  }
}

void HeapSort(int data[]) {
  BuildMaxHeap(data);
  for (int j = sizeof(data); j > 0; j--) {
    int temp = data[0];
    data[0] = data[data.sizeof() - 1];
    data[sizeof(data) - 1] = temp;
    sizeof(data) = sizeof(data) - 1;
    heapify(data, 0);
  }

}

int main()
{
  int i;

  /* Read in the data */
  n = 0;
  while (scanf("%d", &data[n]) == 1)
    ++n;
    /* Sort the numbers low to high */

     HeapSort(data);

  /* Print out the data */
  for (i = 0; i < n; ++i)
    printf("%d", data[i]);
}
堆排序的
/*框架
*CS333 2011年春季
* 
*/
#包括
#定义最大大小1000000
int数据[最大大小];
int n;
int j;
int父级(intj){
如果(j==1)
返回0;
如果(j%2==0)
返回((j/2)-1);
其他的
回报率((j/2));
}
左整数(整数j){
返回(2*j)+1;
}
右整数(整数j){
返回(2*j)+2;
}
void heapify(int data[],int j){
int l=左(j),大;
int r=右(j);
if((数据[l]>data[j])&(l数据[great])&(r=0;j--){
heapify(数据,j);
返回数据;
}
}
void HeapSort(int数据[]){
BuildMaxHeap(数据);
对于(int j=sizeof(数据);j>0;j--){
int temp=数据[0];
数据[0]=数据[data.sizeof()-1];
数据[sizeof(数据)-1]=温度;
sizeof(数据)=sizeof(数据)-1;
heapify(数据,0);
}
}
int main()
{
int i;
/*读入数据*/
n=0;
而(scanf(“%d”)和数据[n])==1)
++n;
/*将数字从低到高排序*/
HeapSort(数据);
/*把数据打印出来*/
对于(i=0;i
您的大多数问题似乎都在HeapSort例程中:

void HeapSort(int data[]) {
  BuildMaxHeap(data);
  for (int j = sizeof(data); j > 0; j--) {
当您将数组传递给这样的函数时,函数接收的实际上是一个指针。在该指针上使用
sizeof
不会告诉您指针指向的数据的大小——它只会告诉您指针本身占用了多少字节(通常为4字节)。您可能希望将数组大小作为参数传递:

void HeapSort(int *data, size_t data_size) {
在本例程的其余部分中,您将参考
data\u size
,而不是
sizeof(data)


sizeof(无论什么)
本质上也是一个常量,而不是一个变量;您不能将其用作分配的目标(但是,同样,使用上面建议的
data\u size
可以让您执行分配)。

我应该将数据大小或大小初始化为什么?输入整数的大小将是可变的thnx@user593301:从外观上看,您将其视为数组中的元素数。在您的
main
中,您似乎正在为此使用
n
。只是想弄清楚,
size\u t
是一种类型,
data\u size
将是该类型的参数。不需要全局变量
j
;函数中使用
j
的地方都有一个局部变量。不需要全局变量
n
;它应该是
main()
中的本地函数,并传递给需要知道要排序的元素数量的其他函数。对一百万个整数进行排序有点雄心勃勃——尽管一旦代码正常工作,它将处理一百万个和一千个(不管是否需要额外的时间)。
int temp = data[0];
data[0] = data[data.sizeof() - 1];
data[sizeof(data) - 1] = temp;
sizeof(data) = sizeof(data) - 1;