1.基本思想:
第i趟排序开始时,当前有序区和无序区分别为R[0…i-1],R[i…n-1] (0<=i<n-1),该趟排序是从当前无序区中选出关键字最小的元素R[k],将它与无序区的第一个元素R[i]交换,使R[0…i]为新的有序区,R[i+1…n-1]为新的无序区
2.例子讲解:
49, 38, 65, 97, 76, 13, 27
一开始的无序区就是上面的所有数49, 38, 65, 97, 76, 13, 27
,有序区默认没有
第一次从无序区中找到最小元素13和无序区第一个元素49交换位置,新的无序区为 38, 65, 97, 76, 49, 27
新的有序区为:13
以此类推
图片来自网络
3.代码实例C语言:
#include<stdio.h>
#define LENGTH 6
void simpleSort(int disorder[],int length) {
int min_index = 0;
int temp = 0;
for(int i = 0;i<length;i++) {
min_index = i;//令i为最小下标min_index
for(int j = i+1;j<length;j++) {
if(disorder[j]<disorder[i]) {//每次遍历找到最小值的下标
min_index = j;
}
}
if(min_index!=i) {//如果发现了比min_index下标还小的元素,就交换i下标与min_index下标的值
temp = disorder[i];
disorder[i] = disorder[min_index];
disorder[min_index] = temp;
}
}
}
void main() {
int disorder[] = {49, 38, 65, 97, 76, 13, 27};//无序区
simpleSort(disorder, LENGTH);
for(int i = 0;i<LENGTH;i++) {
printf("%d ",disorder[i]);
}
}
换种数据结构书上的那种写法:
#include<stdio.h>
#define LENGTH 6
typedef struct {
int key;
}RecType;
void simpleSort(RecType disorder[],int length) {
int min_index = 0;
RecType temp;
for(int i = 0;i<length;i++) {
min_index = i;//令i为最小下标min_index
for(int j = i+1;j<length;j++) {
if(disorder[j].key<disorder[i].key) {//每次遍历找到最小值的下标
min_index = j;
}
}
if(min_index!=i) {//如果发现了比min_index下标还小的元素,就交换i下标与min_index下标的值
temp = disorder[i];
disorder[i] = disorder[min_index];
disorder[min_index] = temp;
}
}
}
void main() {
RecType disorder[7] = {
{49}, {38}, {65}, {97}, {76}, {13}, {27}};//无序区
simpleSort(disorder, LENGTH);
for(int i = 0;i<LENGTH;i++) {
printf("%d ",disorder[i]);
}
}
输出结果如下
4.时间复杂度分析
1.平均时间复杂度:O(n²)
2.空间复杂度:O(n)
在简单选择排序算法中simpleSort()
函数中使用i、j、k和temp 这4个辅助变量,与问题规模n无关,被调用后资源释放,而主函数中int disorder[] = {49, 38, 65, 97, 76, 13, 27}
定义了一个数组,并分配空间,故空间复杂度为O(n)