参考:

《2022 年数据结构考研复习指导》王道论坛

https://www.bilibili.com/video/BV1Eb41147dK?from=search&seid=7630499509795698118

https://baike.baidu.com/item/%E5%A0%86%E6%8E%92%E5%BA%8F/2840151?fr=aladdin

https://baike.baidu.com/item/%E5%A0%86/20606834?fr=aladdin

 

 

一,选择排序

0,有序区

  有序区:数组中已经排序好的连续区间。

1,算法思想(升序)

  将有序区设在数组的开头 / 末尾,然后从无序区中选择一个最小值 / 最大值,交换到无区序的第一个元素 / 最后一个元素,作为新选择出来的元素添加到有序区。一直循环到无序区为空。

2,算法步骤(有序区在数组末尾)

  ① 用 i 从数组末尾向前遍历 n- 1 个元素。

    从数组末尾向前遍历是因为:

      有序区是在数组末尾,接下来找到的最大值是要交换到无序区的最后一个元素,从后往前遍历的话,i 就可以代表无序区的最后一个元素下标,直接进行交换。

    遍历 n-1 个元素是因为:

      只要要排序好 n-1 个数,剩下的一个数也就是有序的。

3,代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 110
int a[N];
void swap(int i, int j)
{
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}
void selectSort(int n)  // 升序的选择排序
{
    for (int i = n - 1; i > 0; i--)
    {
        int k = 0;  // 0~i 的最大值的下标
        for (int j = 1; j <= i; j++)
            if (a[j] > a[k])
                k = j;
        swap(i, k);
    }
}
int main(void)
{
    int n;
    while (scanf("%d", &n) != EOF)
    {
        for (int i = 0; i < n; i++)
            scanf("%d", &a[i]);
        selectSort(n);
        for (int i = 0; i < n; i++)
            printf("%d ", a[i]);
        puts("");
    }
    system("pause");
    return 0;
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-07
  • 2021-03-28
  • 2021-07-24
  • 2022-12-23
  • 2021-05-13
  • 2021-09-16
猜你喜欢
  • 2021-07-24
  • 2022-01-13
  • 2022-12-23
  • 2022-12-23
  • 2021-08-24
  • 2021-10-28
相关资源
相似解决方案