algorithm - 这个排序对吗?或者它是否缺少任何东西
问题描述
尝试几次后,该算法似乎有效,但我不确定它是否正确。任何人都可以帮忙吗?
n 是数组的大小
i 从第一个案例到案例编号 (n-1)
j 从 i+1 到 n
#include <stdio.h>
#include <stdlib.h>
void main() {
int t[50];
int i;
int j;
int n;
int aux;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
scanf("%d", &t[i]);
}
for (i = 1; i <= n - 1; i++) {
for (j = i + 1; j <= n; j++) {
if (t[i] > t[j]) {
aux = t[i];
t[i] = t[j];
t[j] = aux;
}
}
}
for (i = 1; i <= n; i++) {
printf("|| %d", t[i]);
}
}
解决方案
看起来像伪代码,你的算法如下:
Sort(A, N):
for (i = 1 to N-1):
for (j = i+1 to N):
if (A[i] > A[j]):
swap(A, i, j)
其中 A 是数字数组,N 是数组大小。
自从我尝试证明任何事情的正确性以来已经有一段时间了,但似乎如果外部循环可以保证在每次迭代结束时,最小的数字将是A[i]
,它将是正确的。所以问题是内部循环是否将最小元素放入A[i]
.
由于它每次交换A[i]
都大于,我们可以保证它总是大于内循环的任何第 - 次迭代,因此在内循环完成执行时(当)将是子数组的最小元素。因此,该算法是正确的。A[j]
A[i]
A[j]
A[k-1]
A[i]
k
A[i]
A[i:N]
k = N+1
我对 C 编程不太熟悉,所以我无法告诉您您的代码是否完全遵循这一点,但如果确实如此,那么您的代码示例也是正确的。