void swap(int a[], int x, int y)
{
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
void sort(int arr[], int x)
{
static int count = 0;
if (x == 1)
{
return;
}
int min = 100; // random value
int index;
for (int i = 0; i < x; i )
{
if (arr[i] < min)
{
min = arr[i];
index = i;
}
}
swap(arr, count, index);
count ;
sort(arr 1, x - 1);
}
int main()
{
int x;
cin >> x;
int A[x];
for (int i = 0; i < x; i )
{
cin >> A[i];
}
sort(A, x);
for (int i = 0; i < x; i )
{
cout << A[i] << " ";
}
cout << endl;
return 0;
}
這段代碼是使用遞回的選擇排序。它正在列印垃圾值。這有什么錯誤。我不確定,但我猜是因為在排序函式()中使用了靜態變數。它正在列印垃圾值
uj5u.com熱心網友回復:
替換swap(arr, count, index);為
swap(arr, 0, index);
并洗掉static int count = 0;.
sort(A, x);在主要替換為
sort(A, x - 1);
并將條件更改if (x == 1)為if (x == 0)。
我建議重命名index為last.
替換min = 100;為
min = arr[0];
uj5u.com熱心網友回復:
對于像這樣的初學者可變長度陣列
int x;
cin >> x;
int A[x];
不是標準的 C 功能。
然而,該函式可以呼叫未定義的行為,例如,當第二個引數等于 時呼叫0。
宣告靜態變數也沒有意義。
該函式不會對值大于 100 的陣列元素進行排序。
變數index必須在 for 回圈之前初始化為 0。
此外,已經std::swap有交換兩個物件的標準函式。
該函式可以通過以下方式定義
#include <algorithm>
void selection_sort( int a[], size_t n )
{
if ( not ( n < 2 ) )
{
auto it = std::min_element( a, a n );
if ( it != a ) std::iter_swap( a, it );
selection_sort( a 1, n - 1 );
}
}
如果您還不知道標準演算法,那么函式可以如下所示
void swap( int &a, int &b )
{
int rmp = a;
a = b;
b = tmp;
}
void selection_sort( int a[], size_t n )
{
if ( not ( n < 2 ) )
{
size_t index = 0;
for ( size_t i = 1; i < n; i )
{
if ( a[i] < a[index] ) index = i;
}
if ( index != 0 ) swap( a[0], a[index] );
selection_sort( a 1, n - 1 );
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381473.html
上一篇:字典排序后,輸出不一樣?
下一篇:用于搜索范圍和回傳列標題的公式
