問題
我有一個 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;
}
}
}
}
C 代碼構建在與 Java 源代碼相同的合并排序偽代碼上,但無法作業
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 會是一個例外,請幫助...
uj5u.com熱心網友回復:
對于初學者,您的問題中沒有合并排序演算法。
事實上,有一種改進的選擇排序演算法。
這個函式宣告
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
uj5u.com熱心網友回復:
通常,您應該使用std::arrayorstd::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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362608.html
上一篇:長生不老藥和換行符中的System.get_env(\n)
下一篇:如何創建另一個保證預測的陣列集
