简单选择排序算法

简单选择排序算法

基本策略

  • 每次从无序序列中选出一个关键字最大(最小)的记录添加到有序序列尾部

基本思想

  • 第一趟:从长度为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;
}

输出如下
在这里插入图片描述

参考资料

  1. 《数据结构与算法》北京大学出版社 2018年版 林劼 刘震 陈端兵 戴波 著
posted @ 2021-04-20 12:56  跌落星球  阅读(31)  评论(0编辑  收藏  举报