質問編集履歴

3 コードの内容の変更と結果の提示

GAKU_SAY

GAKU_SAY score 16

2020/07/02 07:46  投稿

ヒープソートを作っているのですが動かなくなってしまいます。
###したいこと
配列array_intをヒープ条件に合うように並び替えたい。
###条件
なるべく関数を書き換えたくないです。(名称は絶対に)
xcode
c++
###欲しい情報
解決方法またはエラーの解決に関する情報
解決方法に関する情報
###結果
1
0
0
0
1886912525
1835627109
1635020389
1634557804
1701535600
121
###コード
```c++
#include<iostream>
int *array_int;//{1,13,14,60,15,91,24,71,80,63};
double *array_dob;
int mode = 0;
int size = 3;
using namespace std;
template <class X>void swap(X *a, X *b){
   X box = *a;
   *a = *b;
   *b = box;
}
int check_heap(){
   
   int j=0;
   
   for (int i=1; i<size; i++) {
       
       if (i%2 == 1) {
           j = (i-1)/2;
       }else{
           j=i/2-1;
       }
       
       if (mode == 0) {
           if (array_int[i] < array_int[j]) {
               return 0;
           }
       }else if (mode == 1){
           if (array_dob[i] < array_dob[j]) {
               return 0;
           }
       }
       
   }
   
   return 1;
}
void shift_down(){
   
   int i=0,j=0;
   
   if (mode == 0) {
       
       
       while (!check_heap()) {
           
           if (array_int[2*i+1] > array_int[2*i+2]) {
               j = 2*i+2;
           }else{
               j = 2*i+1;
           }
           
           swap(&array_int[i],&array_int[j]);
           
           i = 2*i+1;
       }
       
       
   }else if (mode == 1){
       
       while (!check_heap()) {
           
           if (array_dob[2*i+1] > array_dob[2*i+2]) {
               j = 2*i+2;
           }else{
               j = 2*i+1;
           }
           
           swap(&array_dob[i],&array_dob[j]);
           
           i = 2*i+1;
       }
   }
   
}
template<typename var>void insert(var val){
   
   ///メモリ確保&代入
   size++;
   
   if (mode == 0) {
       
       if ((array_int = (int*)realloc(array_int, sizeof(int)*size))==NULL) {
           cout << "I can't get enough size memory. SORRY" << endl;
       }
       
       array_int[size-1] = val;
       
   }else if (mode == 1){
       
       if ((array_dob = (double*)realloc(array_dob, sizeof(double)*size))==NULL) {
           cout << "I can't get enough size memory. SORRY" << endl;
       }
       
       array_dob[size-1] = val;
       
   }
   ///メモリ確保終了&代入
   
   int i=size-1,j = 0;
   
   while (!check_heap()) {
       
       if (i%2 == 1) {
           j = (i-1)/2;
       }else{
           j=(i-2)/2;
       }
           
       if (mode == 0) {
           swap(&array_int[i], &array_int[j]);
       }else if (mode == 1){
           swap(&array_dob[i], &array_dob[j]);
       }
       
       shift_down();
       
       i=j;
   }
   
}
template <typename var>var deletemin(){
   
   var returner = 0.0;
   
   if (mode == 0) {
       reterner = array_int[0];
       swap(&array_int[0],&array_int[size-1]);
   }else if(mode == 1){
       reterner = array_dob[0];
       swap(&array_dob[0],&array_dob[size-1]);
   }
   size--;
   
   array_int = (int*)realloc(array_int, sizeof(int)*size);
   
   shift_down();
   
   return returner;
}
int HeapSort(){
   
   /***array_intをヒープ構造にしたい***/
   
   
   
   int *aps = (int*)malloc(sizeof(int)*size);
   int i=0;
   int past = size;
   
   size = 1;
   aps[0] = array_int[0];
   
   for (i=size; i<past; i++) {
       insert(aps[i]);
   }
   
   free(array_int);
   array_int = aps;
   return 0;
}
int main(){
   
   size = 10;
   
   array_int = (int *)malloc(sizeof(int)*size);
   array_int[0] = 1;
   array_int[1] = 13;
   array_int[2] = 14;
   array_int[3] = 60;
   array_int[4] = 15;
   array_int[5] = 91;
   array_int[6] = 24;
   array_int[7] = 71;
   array_int[8] = 80;
   array_int[9] = 63;
   
   HeapSort();
   
   for (int i=0; i<size; i++) {
       printf("%d\n",array_int[i]);
   }
   
   
   free(array_int);
   
   return 0;
}
```
  • C++

    6964 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Xcode

    7522 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • 配列

    1699 questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

2 コードの修正

GAKU_SAY

GAKU_SAY score 16

2020/07/02 07:34  投稿

ヒープソートを作っているのですが動かなくなってしまいます。
###したいこと
配列array_intをヒープ条件に合うように並び替えたい。
###条件
なるべく関数を書き換えたくないです。(名称は絶対に)
xcode
c++
###欲しい情報
解決方法またはエラーの解決に関する情報
###コード
```c++
#include<iostream>
int *array_int;//{1,13,14,60,15,91,24,71,80,63};
double *array_dob;
int mode = 0;
int size = 3;
using namespace std;
template <class X>void swap(X *a, X *b){
   X box = *a;
   *a = *b;
   *b = box;
}
int check_heap(){
   
   int j=0;
   
   for (int i=1; i<size; i++) {
       
       if (i%2 == 1) {
           j = (i-1)/2;
       }else{
           j=i/2-1;
       }
       
       if (mode == 0) {
           if (array_int[i] < array_int[j]) {
               return 0;
           }
       }else if (mode == 1){
           if (array_dob[i] < array_dob[j]) {
               return 0;
           }
       }
       
   }
   
   return 1;
}
void shift_down(){
   
   int i=0,j=0;
   
   if (mode == 0) {
       
       
       while (!check_heap()) {
           
           if (array_int[2*i+1] > array_int[2*i+2]) {
               j = 2*i+2;
           }else{
               j = 2*i+1;
           }
           
           swap(&array_int[i],&array_int[j]);
           
           i = 2*i+1;
       }
       
       
   }else if (mode == 1){
       
       while (!check_heap()) {
           
           if (array_dob[2*i+1] > array_dob[2*i+2]) {
               j = 2*i+2;
           }else{
               j = 2*i+1;
           }
           
           swap(&array_dob[i],&array_dob[j]);
           
           i = 2*i+1;
       }
   }
   
}
template<typename var>void insert(var val){
   
   ///メモリ確保&代入
   size++;
   
   if (mode == 0) {
       
       if ((array_int = (int*)realloc(array_int, sizeof(int)*size))==NULL) {
           cout << "I can't get enough size memory. SORRY" << endl;
       }
       
       array_int[size-1] = val;
       
   }else if (mode == 1){
       
       if ((array_dob = (double*)realloc(array_dob, sizeof(double)*size))==NULL) {
           cout << "I can't get enough size memory. SORRY" << endl;
       }
       
       array_dob[size-1] = val;
       
   }
   ///メモリ確保終了&代入
   
   int i=size-1,j = 0;
   
   while (!check_heap()) {
       
       if (i%2 == 1) {
           j = (i-1)/2;
       }else{
           j=(i-2)/2;
       }
           
       if (mode == 0) {
           swap(&array_int[i], &array_int[j]);
       }else if (mode == 1){
           swap(&array_dob[i], &array_dob[j]);
       }
       
       shift_down();
       
       i=j;
   }
   
}
template <typename var>var deletemin(){
   
   var returner = 0.0;
   
   if (mode == 0) {
       reterner = array_int[0];
       swap(&array_int[0],&array_int[size-1]);
   }else if(mode == 1){
       reterner = array_dob[0];
       swap(&array_dob[0],&array_dob[size-1]);
   }
   size--;
   
   array_int = (int*)realloc(array_int, sizeof(int)*size);
   
   shift_down();
   
   return returner;
}
int HeapSort(){
   
   int *aps = (int*)malloc(sizeof(int)*size);
   int i=0;
   int past = size;
   size = 3;
   
   for (i=0; i<size; i++) {
       aps[i] = array_int[i];
   }
   
   for (; i<past; i++) {
       insert(array_int[i]);
   }
   size = past;
   
   free(array_int);
   array_int = aps;
   /***array_intをヒープ構造にしたい***/
   
   
   
   return 0;
}
int main(){
   
   size = 10;
   
   array_int = (int *)malloc(sizeof(int)*size);
   array_int[0] = 1;
   array_int[1] = 13;
   array_int[2] = 14;
   array_int[3] = 60;
   array_int[4] = 15;
   array_int[5] = 91;
   array_int[6] = 24;
   array_int[7] = 71;
   array_int[8] = 80;
   array_int[9] = 63;
   
   HeapSort();
   
   for (int i=0; i<size; i++) {
       printf("%d\n",array_int[i]);
   }
   
   
   free(array_int);
   
   return 0;
}
```
  • C++

    6964 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Xcode

    7522 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • 配列

    1699 questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1 コードが間違ってました。

GAKU_SAY

GAKU_SAY score 16

2020/07/02 07:25  投稿

ヒープソートを作っているのですが動かなくなってしまいます。
###したいこと
配列array_intをヒープ条件に合うように並び替えたい。
 
###エラー内容  
HeapSort()内のinsert(i);の内部のshiftdown()で「Thread 1: EXC_BAD_ACCESS (code=1, address=0x10851ec9c)」というエラーが起きます。理由は多分、i>>sizeだからだと思います。  
###条件
なるべく関数を書き換えたくないです。(名称は絶対に)
xcode
c++
###欲しい情報
解決方法またはエラーの解決に関する情報
###コード
```c++
#include<iostream>
int *array_int;//{1,13,14,60,15,91,24,71,80,63};
double *array_dob;
int mode = 0;
int size = 3;
using namespace std;
template <class X>void swap(X *a, X *b){
   X box = *a;
   *a = *b;
   *b = box;
}
int check_heap(){
   
   int j=0;
   
   for (int i=1; i<size; i++) {
       
       if (i%2 == 1) {
           j = (i-1)/2;
       }else{
           j=i/2-1;
       }
       
       if (mode == 0) {
           if (array_int[i] < array_int[j]) {
               return 0;
           }
       }else if (mode == 1){
           if (array_dob[i] < array_dob[j]) {
               return 0;
           }
       }
       
   }
   
   return 1;
}
void shift_down(){
   
   int i=0,j=0;
   
   if (mode == 0) {
       
       
       while (!check_heap()) {
           
           if (array_int[2*i+1] > array_int[2*i+2]) {
               j = 2*i+2;
           }else{
               j = 2*i+1;
           }
           
           swap(&array_int[i],&array_int[j]);
           
           i = 2*i+1;
       }
       
       
   }else if (mode == 1){
       
       while (!check_heap()) {
           
           if (array_dob[2*i+1] > array_dob[2*i+2]) {
               j = 2*i+2;
           }else{
               j = 2*i+1;
           }
           
           swap(&array_dob[i],&array_dob[j]);
           
           i = 2*i+1;
       }
   }
   
}
template<typename var>void insert(var val){
   
   ///メモリ確保&代入
   size++;
   
   if (mode == 0) {
       
       if ((array_int = (int*)realloc(array_int, sizeof(int)*size))==NULL) {
           cout << "I can't get enough size memory. SORRY" << endl;
       }
       
       array_int[size-1] = val;
       
   }else if (mode == 1){
       
       if ((array_dob = (double*)realloc(array_dob, sizeof(double)*size))==NULL) {
           cout << "I can't get enough size memory. SORRY" << endl;
       }
       
       array_dob[size-1] = val;
       
   }
   ///メモリ確保終了&代入
   
   int i=size-1,j = 0;
   
   while (!check_heap()) {
       
       if (i%2 == 1) {
           j = (i-1)/2;
       }else{
           j=(i-2)/2;
       }
           
       if (mode == 0) {
           swap(&array_int[i], &array_int[j]);
       }else if (mode == 1){
           swap(&array_dob[i], &array_dob[j]);
       }
       
       shift_down();
       
       i=j;
   }
   
}
template <typename var>var deletemin(){
   
   var returner = 0.0;
   
   if (mode == 0) {
       reterner = array_int[0];
       swap(&array_int[0],&array_int[size-1]);
   }else if(mode == 1){
       reterner = array_dob[0];
       swap(&array_dob[0],&array_dob[size-1]);
   }
   size--;
   
   array_int = (int*)realloc(array_int, sizeof(int)*size);
   
   shift_down();
   
   return returner;
}
int HeapSort(){
   
   int i = deletemin<int>();
   
   insert(i);
   int *aps = (int*)malloc(sizeof(int)*size);
   int i=0;
   int past = size;
   size = 3;
   
   for (i=0; i<size; i++) {
       aps[i] = array_int[i];
   }
   
   for (; i<past; i++) {
       insert(array_int[i]);
   }
   size = past;
   
   free(array_int);
   array_int = aps;
   
   
   
   return 0;
}
int main(){
   
   size = 10;
   
   array_int = (int *)malloc(sizeof(int)*size);
   array_int[0] = 1;
   array_int[1] = 13;
   array_int[2] = 14;
   array_int[3] = 60;
   array_int[4] = 15;
   array_int[5] = 91;
   array_int[6] = 24;
   array_int[7] = 71;
   array_int[8] = 80;
   array_int[9] = 63;
   
   HeapSort();
   
   for (int i=0; i<size; i++) {
       printf("%d\n",array_int[i]);
   }
   
   
   free(array_int);
   
   return 0;
}
```
  • C++

    6964 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Xcode

    7522 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • 配列

    1699 questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る