2017-04-02 1 views
0

としてポインタの配列を提供することにより、配列をソート私はこのコードを書いたが、それだけで私に何かのアドレスを与えている:は、引数

#include<iostream> 
using namespace std; 

void swap(int* a,int* b) 
{ 
    int temp=*a; 
    *a=*b; 
    *b=temp; 
} 

void sort(int* p[],int n) 
{ 
    for(int i=0; i<n;i++) 
    { 
     if(*p[i]>*p[i+1]) 
     swap(p[i],p[i+1]); 
    } 
} 

int main() 
{ 
    int arr[]={8,6,5,4,3,7,1}; 
    int* p[7]; 

    for(int i=0;i<7;i++) 
    { 
     p[i]=&arr[i]; 
    } 

    sort(p,7); 

    /*i tried to change arr[1] to p[1] or *p[1] but same output*/ 
    cout<<arr[1]<<arr[2]; 
    return 0; 
} 

私はどこかの概念に欠けていると思います。空のソート(フロート* pを[]、int型n)を

が間接的に山車がポインタを再配置することにより、配列pの最初のn個のポインタで指さソート次の関数を書く:完全な質問はこれです

助けてください。

+0

知っています* []'(STD 'に頼らずに: :sort'、あなたは実際のコードで行いますが、これはどのような目的で練習の目的を破るでしょうか?) –

答えて

0

最初のコードにはバッファオーバーフローがあります。これは定義されていない動作を意味します。そのため、定義どおり正しい動作をします。 sortでは、インデックスiは、0からn-1までのすべての配列位置になります。しかし、あなたはi+1にアクセスします。これは配列を超えた要素です。私のために、コードはsegfaultsです。

これを修正すると出力は「54」になります。

スワップ関数は、の代わりにarrの値をスワップします(p)。エクササイズでは、ポインタを間接的にソートするように指示します。 **または* &を使用する必要があります。ソートループでは、8と6が入れ替えられ、8と5が入れ替えられ、8と4が入れ替えられます。あなたの配列は{6,5,4,3,7,1,8}です。最後に5と4のarr [1]と[2]を出力します。それらの間にスペースを出力しないので、 "54"が得られます。

1

ここでは、あなたが望むことを実行するためのより良い方法ですが、それはより良いことができる多くの方法がありますが、あなたの新しいC++のように見えるので、私はできるだけシンプルにしようとしました。ここで

#include "stdafx.h" 
#include<iostream> 
using namespace std; 

//not needed, std::swap does the same job! 
void swap(int *a, int *b) 
{ 
    std::swap(a, b); 
} 

//using a pointer to the array is better! 
void sort(int arr[], int n) 
{ 
    //two loops are needed to sort the entire array! 
    for (int x(0); x < n - 1; x++) 
    { 
     //optimize the loop by removing already sorted items from loop 
     int sorted = n - x; 
     for (int y(0); y < sorted - 1; ++y) 
      if (arr[y] > arr[y + 1]) 
       std::swap(arr[y], arr[y + 1]); 
    } 
} 


int main() 
{ 
    //vector or std::array better option! 
    int arr[] { 8,6,5,4,3,7,1 }; 

    //provide the array to sort(), no need to make stuff harder 
    sort(arr, 7); 

    //Show you that the sort worked! 
    for (int ccc = 0; ccc < 7; ccc++) 
     std::cout << arr[ccc] << ' '; 

    std::cout << '\n'; 

    cout << "Index 5: " << arr[5] << "\nIndex 6: " << arr[6] << "\n"; 

    return 0; 
} 

配列をソートするには非常に良いチュートリアルです:あなたは、単純な `int型[]`ではなく `floatをソートする方法http://www.learncpp.com/cpp-tutorial/64-sorting-an-array-using-selection-sort/