查看: 479|回复: 3

[算法] 选择排序算法实现&讲解

[复制链接]

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
5912
人气
156
分享
52

最佳新人活跃会员

发表于 2024-3-31 15:19:11 | 显示全部楼层 |阅读模式
【选择排序算法设计】

选择排序算法的原理是,寻找数组中最小的数字,和区域内的第一个数字互换位置,
每进行一次排序,区域就缩小一位
例如在arr和arr[size]中寻找最小的数,并和i对换位置
下一次会在arr[i+1]和arr[size]中寻找最小的数,和i+1兑换位置,以此类推

首先我们需要实现一个GetMinPos函数
[C++] 纯文本查看 复制代码
int GetMinPos(int arr[], int begin, int end)
{
    // 设最小的数字位于begin处
    int minPos = begin;

    for (int i = begin + 1;i <= end;i++) {
        if (arr[i] < arr[minPos]) {
            // 如果i处小于minPos处,则目前minPos为i
            minPos = i;
        }
    }
    return minPos;
}

假设minPos位于begin处,如果arr < arr[minPos],则把minPos设为i
遍历完成后可获取最小的数的position
为了将数字交换位置,还需要一个swap函数,有许多解法,这里用了最简单的
[C++] 纯文本查看 复制代码
void Swap(int &a, int &b)
{
    // 典型的临时变量交换法
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}

最后就是SelectionSort函数,个人觉得很好理解
[C++] 纯文本查看 复制代码
void SelectionSort(int arr[], int size)
{
    for (int next = 0;next < size - 1;next++) {
        // 从next处开始的最小值的位置
        int minPos = GetMinPos(arr, next, size - 1);
        // 与next所在的位置交换
        Swap(arr[next], arr[minPos]);
    }
}

附:完整源代码
[C++] 纯文本查看 复制代码
#include <stdio.h>

int GetMinPos(int arr[], int begin, int end)
{
    // 设最小的数字位于begin处
    int minPos = begin;

    for (int i = begin + 1;i <= end;i++) {
        if (arr[i] < arr[minPos]) {
            // 如果i处小于minPos处,则目前minPos为i
            minPos = i;
        }
    }
    return minPos;
}

void Swap(int &a, int &b)
{
    // 典型的临时变量交换法
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}

void SelectionSort(int arr[], int size)
{
    for (int next = 0;next < size - 1;next++) {
        // 从next处开始的最小值的位置
        int minPos = GetMinPos(arr, next, size - 1);
        // 与next所在的位置交换
        Swap(arr[next], arr[minPos]);
    }
}

void PrintElement(int arr[], int size)
{
    for (int i = 0;i < size;i++) {
        printf("%d ", arr[i]);
    }
}

int main()
{
    int arr[] = {5, 3, 8, 19, 0, 2};
    printf("Before sorting: ");
    PrintElement(arr, 6);
    SelectionSort(arr, 6); // 6个元素
    printf("\nAfter sorting: ");
    PrintElement(arr, 6);
}

你干嘛~哎哟

0

技术

4

魅力

1

原创

网站编辑

心如止水

Rank: 8Rank: 8

积分
8858
人气
53
分享
476

最佳新人活跃会员

发表于 2024-3-31 17:03:35 | 显示全部楼层
sort快排了解一下
faryou的导航站
目前是区信奥队队员,正在学习算法
别把我当回事儿,我只是一个卑微的初中生……

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
5912
人气
156
分享
52

最佳新人活跃会员

 楼主| 发表于 2024-3-31 19:32:00 | 显示全部楼层
faryou 发表于 2024-3-31 17:03
sort快排了解一下

got it,在学
你干嘛~哎哟

0

技术

4

魅力

1

原创

网站编辑

心如止水

Rank: 8Rank: 8

积分
8858
人气
53
分享
476

最佳新人活跃会员

发表于 2024-3-31 20:31:39 | 显示全部楼层

另外,C++本身就有swap函数
faryou的导航站
目前是区信奥队队员,正在学习算法
别把我当回事儿,我只是一个卑微的初中生……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表