简单选择排序算法
简单选择排序算法
基本策略
- 每次从无序序列中选出一个关键字最大(最小)的记录添加到有序序列尾部
基本思想
-
第一趟:从长度为len的序列中选出关键字最大(最小)的记录与第1个记录交换
-
第二趟:从第2个数据开始,从长度为 len-1 的序列中选出关键字最大(最小)的记录与第2个记录交换
-
第三趟:从第3个数据开始,从长度为 len-2 的序列中选出关键字最大(最小)的记录与第3个记录交换
-
…
-
第 i 趟:从第 i 个数据开始,从长度为 len-i+1 的序列中选出关键字最大(最小)的记录与第 i 个记录交换
-
如此进行,直至第 n-1 趟完成,则序列排序完成
实例分析
- 以序列 {6, 15, 45, 23, 9, 78, 35} 做升序排列,其简单排序过程如下
算法分析
- 采用双循环,设置 index, i, j 三个指针,index 用于指示最大(最小)关键字所在, i 用于控制外循环, j 用于控制内循环
- index 指针指向第 i 个数据,遍历剩下的第 n - i 个数据,若找到关键字比第 i 个数据大(小),则将 index 指向该关键字
- 当遍历 n-i 个数据完成后,则 index 的指向则为最大(小) 关键字,若 index 与 i 不等,则说明存在比 i 大(小)的关键字
- 最后,交换 index 与 i 指向的关键字,当完成 n - 1 趟,序列则有序
算法实现(c语言)
/*
* Function:Simple_Select_Sort
* Description:简单选择排序
* Parameter:R 无序序列 len 序列长度
* Return:void
*/
void Simple_Select_Sort(int R[], int len)
{
//对序列 R 做升序排列
for (int i = 0; i < len - 1 ; i++) //比较 n-1 趟
{
int index = i;
for (int j = i + 1; j < len; j++)
{
//寻找最小关键字的索引
if (R[index] > R[j])
{
index = j;
}
}
//关键字最小的记录不在第i个位置上,将关键字最小的记录与第i个位置交换
if (index != i)
{
int temp = R[index];
R[index] = R[i];
R[i] = temp;
}
}
}
算法性能分析
算法测试(c语言)
#include <stdio.h>
void Simple_Select_Sort(int R[], int len)
{
//对序列 R 做升序排列
for (int i = 0; i < len - 1 ; i++) //比较 n-1 趟
{
int index = i;
for (int j = i + 1; j < len; j++)
{
//寻找最小关键字的索引
if (R[index] > R[j])
{
index = j;
}
}
//关键字最小的记录不在第i个位置上,将关键字最小的记录与第i个位置交换
if (index != i)
{
int temp = R[index];
R[index] = R[i];
R[i] = temp;
}
}
}
int main(void)
{
int R[] = {6, 15, 45, 23, 9, 78, 35};
int len = sizeof(R) / sizeof(int);
printf("排序前序列为:\n");
for (int i = 0; i < len; i++)
{
printf("%d\t", R[i]);
}
printf("\n");
Simple_Select_Sort(R, len);
printf("排序后序列为:\n");
for (int i = 0; i < len; i++)
{
printf("%d\t", R[i]);
}
return 0;
}
输出如下
参考资料
- 《数据结构与算法》北京大学出版社 2018年版 林劼 刘震 陈端兵 戴波 著