选择排序原理 及 代码演示

原理

选择排序的算法相对简单,其基本原理与步骤是:

1. 首先,假设数组的第一个元素是最小值,将其值与下标记录;

2. 从第二个元素开始与最小值比较,若该元素小于最小值,则更新最小值与最小值下标;反之则继续下一个比较(等于最小值的可以看做大于它进行处理);

3.一轮比较结束后,我们可以得到最小值与其对应的下标,然后交换首元素与最小值的数值,就完成第一轮;

4. 因为已经找到了最小值且位于首部,所以第二次比较就将数组的第二个元素作为刚刚的第一个元素来用;

5. 以此类推,即可完成排序

图解

在这里插入图片描述
正如图片中展示的,第一轮找到2是最小值,将2与首元素交换位置,第二次就从第二个元素开始;

算法实现

/*********************************************************************************
 *      Copyright:  (C) 2020 Xiao yang IoT System Studio
 *                  All rights reserved.
 *
 *       Filename:  SelectionSort.c
 *    Description:  选择排序
 *                 
 *        Version:  1.0.0(04/25/2020)
 *         Author:  Lu Xiaoyang <[email protected]>
 *      ChangeLog:  1, Release initial version on "04/25/2020 08:48:38 PM"
 *                 
 ********************************************************************************/
#include <iostream>
using namespace std;

const int BUF_SIZE = 8;

/*******************************************************************************
 * 函数名:print
 * 功能:打印数组元素
 * 参数:arr - 要打印的数组,len:数组长度
 * 返回值:无
 ******************************************************************************/
void print(int arr[],int len)
{   
    for(int i = 0; i < len; i++)
    {   
        cout << arr[i] << "  ";
    }
    
    cout << endl;
}

/*******************************************************************************
 * 函数名:SelectionSort
 * 功能:以选择排序的方式排序数组
 * 参数:arr - 要排序的数组,len - 数组元素个数
 * 返回值:无
 ******************************************************************************/
void SelectionSort(int *arr,int len)
{
    int min; //保存每次搜索到的最小值;
    int index; //保存最小值的下标;
    int i ,j;

    for(i = 0; i < len; i++)
    {
        min = arr[i]; //将未排序部分的最左边的数假设为最小值;
        index = i;

        for(j = 0; j < len - i - 1; j++)
        {
            if(arr[j+i+1] >= min) //若大于最小值则继续;
            {
                continue;
            }
            
            else if(arr[j+i+1] < min) //更新最小值与下标
            {
                min = arr[j+i+1];
                index = j+i+1;
            }

        }
        arr[index] = arr[i]; //交换最小值与第一个被假设为最小值的元素位置;
        arr[i] = min;
    }
}

//主函数
int main()
{
    int arr[BUF_SIZE] = {0};

    cout << "请输入数组的8个元素" << endl;

    for(int i = 0; i < BUF_SIZE; i++)
    {
        cin >> arr[i];
    }

    cout << "排序前,数组的顺序是:" << endl;
    print(arr,BUF_SIZE);

    SelectionSort(arr,BUF_SIZE);

    cout << "使用选择排序结束,数组元素的顺序目前是:" << endl;
    print(arr,BUF_SIZE);

    return 0;

}

编译运行

在这里插入图片描述

时间复杂度与稳定性


时间复杂度:O(n^2)

稳定性:不稳定

猜你喜欢

转载自blog.csdn.net/weixin_45121946/article/details/105756822