我有以下代码
#include <iostream>
using namespace std;
int *sort(int arr[]){
for(int i =0; i< 1; i++){
for(int j= 1; j< 5; j++){
if(arr[i]< arr[j]){
int temp = arr[i];
arr[i] =arr[j];
arr[j] = temp;
}
}
}
for(int k=0; k<5;k++){
cout<<arr[k];
}
return arr;
}
int main(){
int arr[5] = {1,2,3,4,5};
sort(arr);
for(int m=0; m<5; m++){
cout<<arr[m];
}
}
我的第一个问题是如何按值传递数组,以便原始数组不会改变,其次我的sort函数不会生成正确的排序,我想按递减顺序对数组进行排序。
答案 0 :(得分:1)
在惯用 C ++中,声明arr
或int
的{{1}}个数组std::array<int, 5> arr;
。值的交换为std::vector<int> arr(5);
。函数应该更改其参数并返回std::swap
,或者更改副本并返回该值。
您也不会遍历外部循环中的每个元素。
void
但是,最简单的排序方法是使用#include <array>
#include <iostream>
void sort(std::array<int, 5> & arr){
for(int i = 0; i < 5; i++){
for(int j = 1; j < 5; j++){
if(arr[i] < arr[j]){
std::swap(arr[i], arr[j]);
}
}
}
}
int main(){
std::array<int, 5> arr = {1,2,3,4,5};
sort(arr);
for(int m=0; m<5; m++){
std::cout<<arr[m];
}
}
的{{1}},其范围为两个<algorithm>
参数
std::sort
答案 1 :(得分:0)
1)您可以使用c ++ swap
函数代替使用临时变量
swap(arr[i], arr[j]);
2)您的for
循环应该如下所示
for(int i = 0; i < 5; i++) {
for(int j = i; j < 5; j++) {
外部循环必须遍历整个数组(从0到4),内部必须遍历数组的“右侧”,因为左侧已经排序
所以我们不能按值传递数组
https://stackoverflow.com/a/16137997/6521788 https://stackoverflow.com/a/16137995/6521788
您可以将值复制到新数组
答案 2 :(得分:0)
基本答案:您无法在C ++中按值传递数组。
解决方案1:在将C样式数组传递给函数之前复制它,并删除返回语句,因为它不需要。
解决方案2:使用std::array
,它是一个提供与基本数组相同功能的容器,以及复制构造函数和复制赋值运算符。
其他评论:
STL确实提供了排序算法(std::sort
),因此在未来程序员的生活中不会自己实现排序算法,除非你在性能重要的地方做了一些非常具体的事情。
答案 3 :(得分:0)
你的问题表明,如何处理C ++中的指针可能会有一些混乱。如果我的假设不正确,那么请跳过(我将在本文末尾提供&#34;我的解决方案&#34; /更正)。
回答你的第一个问题:你不能在C ++中为每个值传递C风格的数组,也不能通过引用传递。你唯一的选择&#34;将循环通过指针,直到&#39; \ n&#39;到达&amp;将内容存储在函数中创建的新数组中。
这将是
的内容'{
int arrx[5] = {};
for(int i = 0; i < 5; i++)
{
arrx[i] = arr[i];
}
for (int j = 0; j < 5; j++) // print
{
std::cout << arrx[j];
}
return 0;
}`
关于指针的其他几点:
int *sort(int arr[]){ -> arr[] passes a pointer to arr(same as *arr)
指针指向内存中指向的第一个元素&amp;没有继承大小意义
sizeof(arr) / sizeof(arr[0])
在sort函数中不起作用(如果您不确切地知道要搜索的数组的长度,则可能会导致问题)。一个简单的解决方案是通过值/引用将函数的大小传递给函数。 另一个解决方案是通过类似于
的东西遍历数组本身for(;arr != '\n'; arr++)
{
//your code here
通过访问各种教程网站,您可以获得有关指针的更多信息。 例如:https://www.tutorialspoint.com/cplusplus/cpp_pointers.htm
http://www.cplusplus.com/doc/tutorial/pointers/
但现在回到原来的问题并希望得到答案。
int *sort(int arr[]) {
for (int i = 0; i< 1; i++) {
应更正为for(int i=0; i< 5-1; i++)
您尝试实现的排序功能称为bubblesort。了解更多信息&amp;有关bubblesort的工作原理,请参阅https://de.wikipedia.org/wiki/Bubblesort
for (int j = 1; j< 5; j++) {
应更正为for(int i=0; i< 5-1-i; i++)
,因为最后的元素已经到位。
if (arr[i]< arr[j]) {
应更正为if (arr[j]< arr[j+1])
,因为您想要比较(例如)第一个元素&amp;以降序/升序获取它的下一个元素。这可以为你的数组中的每个数字对完成。
最后:
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
应该看起来像:
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
请注意,您也可以将其重新格式化为:
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp; // same output
作为示例:如果arr [j] = 5且arr [j + 1] = 6则将值j + 1(6)存储在temp中,用j(5)覆盖arr [j + 1]并且最后在j处存储6以降序(希望我现在得到了,但你得到了要点)
最后;正如其他人已经正确指出的那样,您可以使用std::swap
而不是使用键/临时变量。