我正在嘗試學習 C,我正在做這個程式來對陣列進行排序,但它不起作用,我不知道為什么,我測驗了每個函式并且運行良好,有人知道它是變數問題還是什么?
#include <stdio.h>
#include <stdlib.h>
#define N 5
int V[5] = { -383, 386, 277, 415, 293 };
void displayArray(int arr[], int size)
{
int i;
for (i = 0; i < size; i )
printf("%d ", arr[i]);
}
int maxim(int v[], int n)
{
int i, m;
m = v[0];
/*
Find maxim element
*/
for (i = 1; i < n; i )
if (v[i] > m)
m = v[i];
/*
Search element position
*/
for (i = 0; i < N; i )
if (v[i] == m)
return i;
}
void sort(int v[], int n)
{
int i, pos, t;
for (i = 0; i < n; i )
pos = maxim(v, n - i);
/*
Swap elements
*/
t = v[n - 1 - i];
v[n - 1 - i] = v[pos];
v[pos] = t;
}
int main()
{
displayArray(V, N);
sort(V, N);
printf("\n");
displayArray(V, N);
return 0;
}
輸出是
-383 386 277 415 293- 原始陣列
21900 386 277 415 293- '排序'陣列
uj5u.com熱心網友回復:
首先修復你的maxim功能。其目的是找到一個序列的最大索引v量級n。因此,記住最大值是無關緊要m的;你想記住它的位置:
int maxim(int v[], int n)
{
int m=0;
for (int i=1; i<n; i)
{
if (v[m] < v[i])
m = i; // save new max location
}
return m;
}
在那之后,排序,這是完全錯誤的。這:
int i, pos, t;
for (i = 0; i < n; i )
pos = maxim(v, n - i);
是沒有意義的。它重復計算和覆寫,pos直到最后一次迭代,這是唯一處理的迭代:
t = v[n - 1 - i];
v[n - 1 - i] = v[pos];
v[pos] = t;
例如,您對一個元素進行排序,然后退出排序。您需要對它們全部進行排序,從完整段開始,然后在將最大元素交換到該段的位置后,每次迭代將段的大小減小一。
void sort(int v[], int n)
{
for (int i=0; i<(n-1); i)
{
int m = maxim(v, (n-i)); // max of this segment
int tmp = v[m];
v[m] = v[n-i-1];
v[n-i-1] = tmp;
}
}
uj5u.com熱心網友回復:
您的程式效率低下,但幾乎是正確的。您必須關注的唯一地方是:
void sort(int v[], int n)
{
int i, pos, t;
for (i = 0; i < n; i )
pos = maxim(v, n - i);
/*
Swap elements
*/
t = v[n - 1 - i];
v[n - 1 - i] = v[pos];
v[pos] = t;
}
好吧,C 不是 Python,因此,如果在獲取后pos 要交換陣列的元素,則需要將所有for回圈分組在大括號中,如下所示:
void sort(int v[], int n)
{
int i, pos, t;
for (i = 0; i < n; i ) {
pos = maxim(v, n - i);
/*
Swap elements
*/
t = v[n - 1 - i];
v[n - 1 - i] = v[pos];
v[pos] = t;
}
}
uj5u.com熱心網友回復:
pos = maxim(v, n - i);
應該
pos = maxim(v, n);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427527.html
下一篇:使用其中一個POJO值排序?
