【问题标题】:How to convert java merge sort algo to cpp如何将java合并排序算法转换为cpp
【发布时间】:2021-12-31 13:41:31
【问题描述】:

问题

我有一个 Java 源代码,用于使用 merge sort 算法对数组元素进行排序。该原理使用循环将数组中的元素与数组中下一个索引中的元素进行比较。如果前面的大于后面的,则数字在逻辑上交换为reassign 索引中的数组元素。 我的问题是 Java 算法有效,但 C++ 算法无效。逻辑是一样的,我做错了什么......

代码

Working Java Code

static void sort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}    

基于与 Java 源代码相同的合并排序伪代码构建的 C++ 代码但无法正常工作

void sorting(int d[]) {
    for (int i = 0; i < sizeof(d); i++) {
        for (int j = i + 1; j < sizeof(d); j++) {
            if (d[i] > d[j]) {
                int temp = d[i];
                d[i] = d[j];
                d[j] = temp;
            }
        }
    }
}

输入格式

这两种方法都从初始化为固定大小的数组中获取参数,然后使用循环从用户获取输入并分配给数组,用户必须先输入数组的大小。

合并排序算法在其他语言中的可靠性

我已经在 J​​avaScript、Python 和 C# 中应用了合并排序伪代码,它们都有效。我不知道为什么 C++ 会是一个例外,请帮助...

【问题讨论】:

  • sizeof(d) 不是数组的大小。您将需要将数组长度作为参数传递。或者只使用std::vector。
  • 我在网上查了一下,他们说要检查我们需要使用的数组的大小sizeof
  • 如果您事先知道数组的大小,请使用std::array,如果您不知道,请使用std::vector。
  • 你需要的尺寸sizeof(d)/sizeof(d[0]).
  • 这能回答你的问题吗? size of array passed to C++ function?

标签: java c++ arrays algorithm sorting


【解决方案1】:

一般来说,您应该使用std::array 或std::vector 而不是原始数组 (int[])。它们还提供了您可能从 Java 或其他语言中了解的更多功能。也结帐std::swap。

#include <iostream>
#include <vector>
void sorting(std::vector<int>& d)
{
    for (int i = 0; i < d.size(); i++)
    {
        for (int j = i + 1; j < d.size(); j++)
        {
            if (d[i] > d[j])
            {
                std::swap(d[i], d[j]);
               /*
                int temp = d[i];
                d[i] = d[j];
                d[j] = temp;
              */
            }
        }
    }
}

int main()
{
    std::vector<int> test = {5,1,4,3,2};
    sorting(test);
    for( auto const& elem : test )
    { 
        std::cout << elem << " ";
    }
    std::cout << "\n";
    return EXIT_SUCCESS;
}

【讨论】:

  • 谢谢,这真的很有帮助,为什么我们在参数类型声明之后需要一个指针?
  • 那不是指针,那是参考。不给参考,就复制一份,原数组不变。
  • C++ 很难,几乎这些其他语言实现算法都没有那么多麻烦
【解决方案2】:

对于初学者,您的问题中没有合并排序算法。

实际上有一种修改过的选择排序算法。

这个函数声明

void sorting(int d[])

被编译器调整为声明

void sorting(int *d)

即参数有指针类型。

所以表达

sizeof(d)

产生指针的大小而不是传递数组中元素的数量。

您还需要将数组中元素的数量传递给函数。

函数可以如下所示

void sorting( int a[], size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        size_t min = i;

        for ( size_t j = i + 1; j < n; j++ )
        {
            if ( a[j] < a[min] ) min = j;
        }

       if ( i != min ) std::swap( a[i], a[min] );
    }
}

另一种方法是使用通过引用接受数组的模板函数。

例如

template <size_t N>
void sorting( int ( &a )[N] )
{
    for ( size_t i = 0; i < N; i++ )
    {
        size_t min = i;

        for ( size_t j = i + 1; j < N; j++ )
        {
            if ( a[j] < a[min] ) min = j;
        }

       if ( i != min ) std::swap( a[i], a[min] );
    }
}

这是一个演示程序,展示了这两个函数的用法。

#include <iostream>
#include <utility>

void sorting( int a[], size_t n )
{
    for (size_t i = 0; i < n; i++)
    {
        size_t min = i;

        for (size_t j = i + 1; j < n; j++)
        {
            if (a[j] < a[min]) min = j;
        }

        if (i != min) std::swap( a[i], a[min] );
    }
}

template <size_t N>
void sorting( int ( &a )[N] )
{
    for (size_t i = 0; i < N; i++)
    {
        size_t min = i;

        for (size_t j = i + 1; j < N; j++)
        {
            if (a[j] < a[min]) min = j;
        }

        if (i != min) std::swap( a[i], a[min] );
    }
}

int main()
{
    int a[] = { 5, 4, 3, 2, 1 };
        
    for (const auto &item : a)
    {
        std::cout << item << ' ';
    }

    std::cout << '\n';

    sorting( a, sizeof( a ) / sizeof( *a ) );

    for (const auto &item : a)
    {
        std::cout << item << ' ';
    }

    std::cout << '\n';

    int b[] = { 5, 4, 3, 2, 1 };

    for (const auto &item : b)
    {
        std::cout << item << ' ';
    }

    std::cout << '\n';

    sorting( b );

    for (const auto &item : b)
    {
        std::cout << item << ' ';
    }

    std::cout << '\n';
}

程序输出是

5 4 3 2 1
1 2 3 4 5
5 4 3 2 1
1 2 3 4 5

【讨论】:

  • 你的第二个函数起作用了,由于使用了许多变量,我什么都不懂,但是我复制并粘贴并添加了一个大小参数,它起作用了
猜你喜欢
  • 2014-03-13
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2013-09-04
相关资源
最近更新 更多