选择排序的基本思想是:每一趟(如第 i 趟)在后面的 n - i + 1 (i = 1 , 2 , 3 … , n - 1)[ 包括第 i 个元素 ] 个待排序元素中选取关键字最小的元素,作为有序子序列的第 i 个元素,直到第 i - 1 趟做完,待排序元素只剩下一个,就不用再选了。因为在无序表里面选择最小的元素只能是顺序查找法,并且必须每次都得扫描完整个无序表,并且除了最后一个排序的元素外,每一个元素都得考察一遍,所以这个就不存在最多进行 n - 1 次这种情况(冒泡排序),这个应该是确定的必须得走 n - 1 趟 。
简单选择排序每一趟排序都可以确定一个元素的最终位置 。
算法存储结构的适用性:个人觉得既可以采用顺序存储结构又可以采用链式存储结构,对于顺序存储结构后期会涉及到将无序表中最小的值与第 i 个位置进行交换,这种直接访问的特性,只有顺序存储结构才有,而对于链式存储结构,可以采用单链表形式,对于第 i 个元素,可以采用指针 p 指向第 i 个元素所在的节点,这样,顺序查找,找到最小元素后,直接换值或者换节点都可以 。
算法实现:
/*
简单选择排序:
时间复杂度->最好情况:O(n^2)、平均情况:O(n^2)、最坏情况:O(n^2)
空间复杂度->O(1)
是否稳定->否
*/
#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE 5
typedef struct{
int key;
}ElemType;
void SelectSort(ElemType A[],int n){//升序排列
int i,j,Min;
for(i=0;i<n-1;i++){//对于有n个元素的待排序表,需要n-1趟选择
Min=i;//考虑的是包括第i个及以后的元素中最小的元素
for(j=i+1;j<n;j++){
if(A[j].key<A[Min].key) Min=j;
}
if(Min!=i) swap(A[i],A[Min]);
}//简单选择排序是不稳定的,这就类似于快速排序,当关注第i个位置的时候,只要有比它小的,就会与它进行交换
//如:4 4 2,这时就会不稳定
}
int main(){
ElemType A[]={{5},{4},{3},{2},{1}};
SelectSort(A,MAX_SIZE);
for(int i=0;i<MAX_SIZE;i++){
cout<<A[i].key<<' ';
}
return 0;
}