首页 > 解决方案 > 这个排序对吗?或者它是否缺少任何东西

问题描述

尝试几次后,该算法似乎有效,但我不确定它是否正确。任何人都可以帮忙吗?

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]);
    }
}

标签: algorithmsorting

解决方案


看起来像伪代码,你的算法如下:

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]kA[i]A[i:N]k = N+1

我对 C 编程不太熟悉,所以我无法告诉您您的代码是否完全遵循这一点,但如果确实如此,那么您的代码示例也是正确的。


推荐阅读