数据结构-简单选择排序(含全部代码)

本文详细介绍了一种简单的排序算法——简单选择排序。通过示例代码解释了其工作原理、时间复杂度、空间复杂度以及稳定性。此外,还提供了完整的C++实现代码,并结合顺序表的数据结构演示了排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   函数分析如下:

SelectSort(SqList &L) 参数:顺序表L 功能:排序(默认升序)空间复杂度:O(1) 时间复杂度:O(n方)
                          稳定性:不稳定
思想:假设第i个值为当前最小值(0到i-1已经为升序,且均小于或等于第i个值),令min=i,从i+1向后比较,若小于第i个值
         记录下标(令min等于该元素下标),直至最后一个,若min不等于i说明后面有比第i个值小的元素,则交换。

代码:

void SelectSort(SqList &L)
{
	int min;int temp;
	for(int i=0;i<L.length;i++)
	{
		min=i;
		for(int j=i+1;j<L.length;j++)
		{
			if(L.data[j]<L.data[min])min=j;
		}			
		if(min!=i)
		{
			temp=L.data[min];
			L.data[min]=L.data[i];
			L.data[i]=temp;
		}
	}
}

全部代码:

/*
    Project: sequence_list(数据结构-顺序表) 
    Date:    2018/09/12
    Author:  Frank Yu
    SelectSort(SqList &L) 参数:顺序表L 功能:排序(默认升序)空间复杂度:O(1) 时间复杂度:O(n方)
	                      稳定性:不稳定
	思想:假设第i个值为当前最小值(0到i-1已经为升序,且均小于或等于第i个值),令min=i,从i+1向后比较,若小于第i个值
	     记录下标(令min等于该元素下标),直至最后一个,若min不等于i说明后面有比第i个值小的元素,则交换。
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define MaxSize 100
#define ElemType int
#define Status int
using namespace std;
//顺序表数据结构
typedef struct
{
	ElemType data[MaxSize];//顺序表元素
	int length;            //顺序表当前长度
}SqList;
//***************************基本操作函数*******************************//
//初始化顺序表函数,构造一个空的顺序表 
Status InitList(SqList &L)
{
	memset(L.data,0,sizeof(L));//初始化数据为0
	L.length=0;                //初始化长度为0
	return 0;
}
//创建顺序表函数 初始化前n个数据
bool CreatList(SqList &L,int n)
{
	if(n<0||n>MaxSize)false;//n非法
	for(int i=0;i<n;i++)
	{
		scanf("%d",&L.data[i]);
		L.length++;
	}
	return true;
}
//插入函数 位置i插入数据 i及之后元素后移  1=<i<=length+1 
bool InsertList(SqList &L,int i,ElemType e)
{
	if(i<1||i>L.length+1) //判断位置是否有效
     {
		printf("位置无效!!!\n");
    	return false;
	 }
	if(L.length>=MaxSize)//判断存储空间是否已满
	{
		printf("当前存储空间已满!!!\n");
		return false;
	}
	for(int j=L.length;j>=i;j--)//位置i及之后元素后移
	{
		L.data[j]=L.data[j-1];
	}
	L.data[i-1]=e;
	L.length++;
	return true;
}
//删除函数 删除位置i的元素 i之后的元素依次前移
bool  ListDelete(SqList &L,int i)
{
	if(i<1||i>L.length)
     {
		printf("位置无效!!!\n");
    	return false;
	 }
	for(int j=i;j<=L.length-1;j++)//位置i之后元素依次前移覆盖
	{
		L.data[j-1]=L.data[j];
	}
	L.length--;
	return true;
}
//查找函数 按位置从小到大查找第一个值等于e的元素 并返回位置
int LocateElem(SqList L,ElemType e)
{
 for(int i=0;i<L.length;i++)//从低位置查找
	{
		if(L.data[i]==e)
			return i+1;
	}
 return 0;

}
//********************************功能函数*****************************************//
//输出功能函数 按位置从小到大输出顺序表所有元素
void PrintList(SqList L)
{
	printf("当前顺序表所有元素:");
	for(int i=0;i<L.length;i++)
	{
		printf("%d ",L.data[i]);
	}
	printf("\n");
}
//创建顺序表函数
void Create(SqList &L)
{
	int n;bool flag;
	printf("请输入要创建的顺序表长度(>1):");
	scanf("%d",&n);
	printf("请输入%d个数(空格隔开):",n);
	flag=CreatList(L,n);
	if(flag){
		printf("创建成功!\n");
		PrintList(L);
	}
	else printf("输入长度非法!\n");

}
//插入功能函数 调用InsertList完成顺序表元素插入 调用PrintList函数显示插入成功后的结果
void Insert(SqList &L)
{
  int place;ElemType e;bool flag;
  printf("请输入要插入的位置(从1开始)及元素:\n");
  scanf("%d%d",&place,&e);
  flag=InsertList(L,place,e);
  if(flag) 
  {
	printf("插入成功!!!\n");
	PrintList(L);
  }
}
//删除功能函数 调用ListDelete函数完成顺序表的删除 调用PrintList函数显示插入成功后的结果
void Delete(SqList &L)
{
  int place;bool flag;
  printf("请输入要删除的位置(从1开始):\n");
  scanf("%d",&place);
  flag=ListDelete(L,place);
  if(flag) 
  {
	printf("删除成功!!!\n");
	PrintList(L);
  }
}
//查找功能函数 调用LocateElem查找元素
void Search(SqList L)
{
  ElemType e;int flag;
  printf("请输入要查找的值:\n");
  scanf("%d",&e);
  flag=LocateElem(L,e);
  if(flag) 
  {
	printf("该元素位置为:%d\n",flag);
  }
  else
	  printf("未找到该元素!\n");
}
//简单选择排序 升序排序
void SelectSort(SqList &L)
{
	int min;int temp;
	for(int i=0;i<L.length;i++)
	{
		min=i;
		for(int j=i+1;j<L.length;j++)
		{
			if(L.data[j]<L.data[min])min=j;
		}			
		if(min!=i)
		{
			temp=L.data[min];
			L.data[min]=L.data[i];
			L.data[i]=temp;
		}
	}
	PrintList(L);
}
//菜单
void menu()
{  
   printf("********1.创建        2.插入*********\n");
   printf("********3.删除        4.查找*********\n");
   printf("********5.简单排序    6.输出*********\n");
   printf("********7.退出\n");
}
int main()
{
 SqList L;int choice;
 InitList(L);
 while(1)
 {
  menu();
  printf("请输入菜单序号:\n");
  scanf("%d",&choice);
  if(7==choice) break;
  switch(choice)
  {
  case 1:Create(L);break;
  case 2:Insert(L);break;
  case 3:Delete(L);break;
  case 4:Search(L);break;
  case 5:SelectSort(L);break;
  case 6:PrintList(L);break;
  default:printf("输入错误!!!\n");
  }
 }
 return 0;
}

结果截图:

结果截图

更多数据结构实现:数据结构严蔚敏版的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

### 选择排序算法概述 选择排序是一种通过重复寻找未排序部分中的最小(或最大)元素并与起始位置交换来逐步构建有序序列的排序方法。这类算法的特点是在每一轮迭代中选出当前无序区间的极值,并将其放置于正确的位置上[^1]。 ### 直接选择排序 (Simple Selection Sort) 直接选择排序是最基础的选择排序算法之一,其工作原理如下: - 遍历整个列表,在每次遍历时找到剩余未处理部分的最小值。 - 将该最小值与当前位置上的数互换。 - 继续这一过程直到所有元素都被处理完毕。 #### Python 实现示例 ```python def selection_sort(arr): n = len(arr) for i in range(n): min_index = i for j in range(i + 1, n): if arr[j] < arr[min_index]: min_index = j # Swap the found minimum element with the first element of unsorted part. arr[i], arr[min_index] = arr[min_index], arr[i] # 测试代码 test_array = [64, 25, 12, 22, 11] selection_sort(test_array) print("Sorted array:", test_array) ``` 此段程序展示了如何利用Python实现简单的直接选择排序逻辑[^3]。 ### 堆排序 (Heap Sort)排序也是一种基于选择思想的高效排序技术,它使用二叉堆这种特殊的数据结构来进行操作。具体来说, - 构建一个大根堆/小根堆; - 取出堆顶的最大/最小键值作为已排序序列的一部分; - 调整剩下的n−1个记录构成的新堆再继续上述两步直至完成全部排序。 #### Python 实现示例 ```python import heapq def heap_sort(arr): h = [] for value in arr: heapq.heappush(h, value) return [heapq.heappop(h) for _ in range(len(h))] # 测试代码 test_heap_array = [64, 25, 12, 22, 11] sorted_heap_array = heap_sort(test_heap_array) print("Sorted by HeapSort:", sorted_heap_array) ``` 这段代码说明了怎样借助Python内置模块`heapq`轻松地实现了堆排序功能。 ### 应用场景 选择排序特别适合用于那些对内存访问成本敏感的应用场合,因为它们只需要常量级别的额外空间O(1),而且对于小型数据集表现良好。然而当面对大规模随机分布的数据时,则可能不是最优解;此时可以考虑其他更为高效的排序方案如快速排序或者归并排序等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值