基础数据结构之八大排序算法(四)
④选择排序:
时间复杂度:O(n^2) 使用了循环嵌套,一个for循环嵌套一个for循环
空间复杂度:O(1) 所有使用的额外辅助变量不会影响到整体问题的规模
稳定性:不稳定 存在跳跃交换
(以顺序表作为待排序对象)
1.基本思想:
若是以小到大排序,则每一趟挑选出最小的数值放到这一趟全部数据的第一位(与冒泡排序相反:冒泡排序是每一趟找出最大的放在这一趟数据的末尾),若是从大到小排则相反。
以数组arr[]={12,21,2,11,10,8}为例:
(第一次排序结束后最开始的数据就是最小的数据,因此第二次排序时就不许要再管第一个值,第二次排序时,首个数据变为全部数据的第二个值)
(当剩下最后一个数据时不需要再排序,因此当有n个数据时,只需要排n-1次就可以)
(这里发现两两对比完后没有发生交换行为,则可以直接退出循环,不需要在继续比较,则可以使用一个bool类型的变量来进行控制退出循环)
2.代码实现:
<1>.所需头文件和宏替换:
#include<stdio.h>
#include<stdlib.h>
#include<stbool.h>
#include<malloc.h>
#define ar arr[]={12,21,2,11,10,8}
#define ELEM_TYPE int
int ar;
<2>.顺序表的创建:
typedef struct Sqlist
{
ELEM_TYPE *data;
int length;
int SIZE;
}Sqlist,*PSqlist;
<3>.顺序表的初始化:
void Init_Sqlist(PSqlist L)
{
L->data=arr;
L->length=0;
L->SIZE=sizeof(arr)/sizeof(arr[0]);
}
<4>.打印:
void Show(PSqlist L)
{
for(int i=L->length;i<L->SIZE;i++)
{
printf("%d ",L->data[i]);
}
printf("\n\n");
}
<5>.选择排序:
void SelectSort(PSqlist L)
{
for(int i=L->length;i<L->SIZE;i++)
{
int j=i+1;
bool tag=true;
int min=i;
for(j;j<L->SIZE;j++)
{
tag=true;
if(L->data[min]>L->data[j])
{
tag=false;
min=j;
}
}
if(min!=i)
{
int tmp=L->data[min];
L->data[min]=L->data[i];
L->data[i]=tmp;
}
if(!tag && min==i)//当没有发生交换时,说明这时已经有序,直接退出即可
{
break;
}
}
}
<6>.主函数:
int main()
{
Sqlist head;
Init_Sqlist(&head);
printf("初始数据为:");
Show(&head);
printf("选择排序后的数据为:");
SelectSort(&head);
Show(&head);
}
<7>.运行结果:
希望这篇博客能帮助大家更好的学习和理解选择排序
感谢阅读!