2016-05-27 36 views
-3

我的程序必须对另一个数组中的数组进行排序。 当我运行该程序时,它打印1 2 3 -858993460 5 -858993460 7. 我无法理解错误在代码中的位置。将数组排序到另一个数组C++

#include <iostream> 
using namespace std; 

int main() 
{ 
    const int N = 7; 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int max = arr[0]; 
    for (int i = 1; i < N; i++) 
    { 
     if (max < arr[i]) 
      max = arr[i]; 
    } 
    int sort_arr[N]; 
    for (int j = 0; j < N; j++) 
    { 
     sort_arr[arr[j] - 1] = arr[j]; 
    } 

    for (int i = 0; i < N; i++) 
    { 
     cout << sort_arr[i] << " "; 
    } 

    return 0; 
} 
+2

你到底想干什么这行:'sort_arr [arr [j] - 1] = arr [j];'? – user2296177

+0

当'J'为1时,这个表达式'arr [j] - 1'评估为'17-1',它超出了数组'arr'的范围' –

+0

'sort_arr [arr [j] -1]数组的边界。 (当'j'是'1'时,arr [j]'是'17','arr [j] - 1'是'16' ...并且您在哪里对数组进行排序? – songyuanyao

回答

0

看来,你认为sort_arr[arr[j] - 1] = arr[j]将整理成arrsort_arr。它不会。

排序已经写好了您的位置:http://en.cppreference.com/w/cpp/algorithm/sort您可以使用这样的:

copy(cbegin(arr), cend(arr), begin(sort_arr)); 
sort(begin(sort_arr), end(sort_arr)); 

Live Example

0

如果要排序阵列到另一个阵列,其中一个方法是你犯了一个副本然后使用标准库中的排序函数对第二个数组进行排序。

int arr[10]; 
int b[10]; 
for(int i=0;i<10;i++) 
{ 
    cin>>arr[i]; 
    b[i]=arr[i]; 
} 
sort(b,b+10); 

//这种功能将在升序排列元素进行排序,如果你想改变顺序,然后只需添加一个比较函数作为第三arguement的排序功能。

0

好吧,让我们面对代码中的问题。

您看到的“奇怪”数字来自未初始化的数组sort_arr。未初始化意味着什么?那么sort_arr是在你的记忆中的某个地方。由于程序通常不会清除其内存,而是声称自由使用的内存,因此大块sort_arr可能包含由另一个程序设置的位和字节。由于这些字节被解释为一个整数值,因此会发生这些数字。所以首先要做的是在使用它之前初始化数组。

sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 }; 

现在为什么会出现这些数字?那么你可能希望你的算法设置sort_arr这将导致一个排序的数组中的所有值,对吧?那么,但你的算法不能很好地工作。看到这行:

sort_arr[arr[j] - 1] = arr[j]; 

j是1时会发生什么?然后arr[1]被评估为17并且17-1等于16.因此sort_arr[arr[1] - 1]sort_arr[16]相同,超出了你的数组的界限。

如果你想自己设计一个排序算法,那么我会建议以一个简单的bubble sort算法开始。否则,如果您只需要对数组进行排序,请查看algorithm标头。这是相当简单的使用:

#include <iostream> 
#include <algorithm> 
#include <iterator> // << include this to use begin() and end() 

using namespace std; 

int main() 
{ 
    const int N = 7; 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int sort_arr[N] = { 0, 0, 0, 0, 0, 0, 0 }; 

    copy(begin(arr), end(arr), begin(sort_arr)); 
    sort(begin(sort_arr), end(sort_arr)); 

    for (int i = 0; i < N; i++) 
    { 
     cout << sort_arr[i] << " "; 
    } 
    cout << endl; 
} 

顺便说一句。你正在寻找阵列中最大的价值,对吧?在对数组进行排序后,sort_arr[N - 1]是数组中包含的最大值。

0

我的猜测是这是一种尝试实现一种计数排序。请注意,可变长度数组通常不允许在C++或C的某些版本中使用。您可以使用_alloca()从堆栈中分配以获得等效的可变长度数组:int * sort_arr =(int *)_ alloca(max * sizeof(int)); 。

#include <iostream> 
using namespace std; 

int main() 
{ 
    const int N = 7; 
    // assuming range of values is 1 to ... 
    int arr[N] = { 3, 17, 2, 9, 1, 5, 7 }; 

    int max = arr[0]; 
    for (int i = 1; i < N; i++) 
    { 
     if (max < arr[i]) 
      max = arr[i]; 
    } 
    int sort_arr[max]; 
    for (int i = 0; i < max; i++) 
    { 
     sort_arr[i] = 0; 
    } 
    for (int j = 0; j < N; j++) 
    { 
     sort_arr[arr[j] - 1]++; 
    } 

    for (int i = 0; i < max; i++) 
    { 
     while(sort_arr[i]) 
     { 
      cout << i+1 << " "; 
      sort_arr[i]--; 
     } 
    } 

    return 0; 
} 
相关问题