1、算法思想
选择排序是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,继续放在起始位置直到未排序元素个数为0。
2、算法描述
1>首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 2>再从剩余未排序元素中继续寻找最小(大)元素,然后放到未排序序列的起始位置。 3>重复第二步,直到所有元素均排序完毕。
选择排序的整个过程:
示例代码:
#include<bits/stdc++.h>
using namespace std;
//选择排序
void SelectionSort(int a[],int n)
{
for(int i=0;i<n-1;++i){
int minIndex=i;//假设最小数的索引为i
for(int j=i+1;j<n;j++){
//cout<<a[j]<<" "<<a[minIndex] <<" "<<j;
//如何当前数小于上面假设的数值时
if(a[j]<a[minIndex])
//那么将原来设置的最小数的索引替换成当前数的索引
minIndex=j;
}
//每排完一次,改变最小数的位置
swap(a[i],a[minIndex]);
}
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
}
int main()
{
int sortlist[] = { 5,0,4,1,8,3,7 };
SelectionSort(sortlist,7);
}
3、选择排序优化图示
选择排序的优化思路一般是在一趟遍历中,同时找出最大值与最小值,放到数组两端,这样就能将遍历的趟数减少一半。第一次选择最大值与最小值,过程如下: 优化选择排序示例代码:
#include<bits/stdc++.h>
using namespace std;
//选择排序优化后
void yh_sort(int a[],int n){
/*初始化左端、右端元素索引*/
int left = 0;
int right = n - 1;
while (left < right){
/*初始化最小值、最大值元素的索引*/
int min = left;
int max = right;
for (int i = left; i <= right; i++){
/*标记每趟比较中最大值和最小值的元素对应的索引min、max*/
if (a[i] < a[min])
min = i;
if (a[i] > a[max])
max = i;
}
/*最大值放在最右端*/
int temp = a[max];
a[max] = a[right];
a[right] = temp;
/*此处是先排最大值的位置,所以得考虑最小值(arr[min])在最大位置(right)的情况*/
if (min == right)
min = max;
/*最小值放在最左端*/
temp = a[min];
a[min] = a[left];
a[left] = temp;
/*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/
left++;
right--;
}
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
}
int main()
{
int sortlist[] = { 5,0,4,1,8,3,7 };
yh_sort(sortlist,7);
}
4、算法复杂度
空间复杂度
选择排序的空间复杂度为O(1)。
稳定性
在选择排序中,每趟都会选出最大元素与最小元素,然后与两端元素交换,此时,待排序序列中如果存在与原来两端元素相等的元素,稳定性就可能被破坏。如[5,3,5,2,9],在array[0]与array[3]元素交换时,序列的稳定性就被破坏了,所以选择排序是一种不稳定的排序算法。
时间复杂度
选择排序的时间复杂度为O(n2)。
适用场景
待排序序列中,元素个数较少时。