原理
选择排序的算法相对简单,其基本原理与步骤是:
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 <920916829@qq.com>
* 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)
稳定性:不稳定