【算法】简单选择排序 O(n^2) 不稳定的 C语言

时间:2022-02-11 02:45:44

简单选择排序

一、算法描述

假设序列中有N个元素:

第1趟找到第1到N个元素之间最小的一个,与第1个元素进行交换

第2趟找到第2到N个元素之间最小的一个,与第2个元素进行交换

第3趟找到第3到N个元素之间最小的一个,与第3个元素进行交换

第m趟找到第m到N个元素之间最小的一个,与第m个元素进行交换

第N趟(最后一趟)找到第N到N个元素之间最小的一个(即最后一个元素),与第N个元素进行交换(无需交换)

即每次找到剩下无序序列中元素中最小的,与无序序列最前面的元素交换,逐渐形成第一个元素有序,第一到二个元素有序,第一到三个元素有序。。。。。。。全部元素有序

二、算法分析

有两层循环,共需作 n(n-1)/2 次比较,固时间复杂度为O(n^2)

且是不稳定的排序算法,空间复杂度为O(1)

无论序列怎样,都需完成N趟排序,所以最好、最坏和平均情况的执行时间是相同的

三、算法实现代码

定义顺序表代码:

typedef struct list {
int Size;//大小
int Elements[MaxSize];//用数组存放
}List;//定义顺序表

定义简单选择函数代码:

void Jiandanxuanze(List*lst)
{
int small;//存放最小元素下标
int i, j, temp;
for (i = 0; i<lst->Size - 1; i++)//最后一次无需执行,共执行Size-1次
{
small = i;
for (j = i + 1; j<lst->Size; j++)
{
if (lst->Elements[j]<lst->Elements[small])
small = j;//找到最小的元素的下标存在small,然后与i进行交换
}
temp = lst->Elements[i];
lst->Elements[i] = lst->Elements[small];
lst->Elements[small] = temp;//把最小的元素与最前的即i进行交换
}
}

四、实例测试代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MaxSize 99 typedef struct list {
int Size;//大小
int Elements[MaxSize];//用数组存放
}List;//定义顺序表 void Jiandanxuanze(List*lst);//函数声明 int main(void) {
List a;
int i;
srand((unsigned)time(NULL)); //随机数种子
a.Size = 10;//定义大小为10 for ( i = 0; i<10;i++)
{
a.Elements[i] = rand() % 10;//初始化顺序表
} printf("原表为:");
for (i = 0; i < 10;i++)
{
printf("%d ", a.Elements[i]);
}
printf("\n"); Jiandanxuanze(&a);//调用简单选择函数,修改值需传入地址 printf("简单选择排序后为:");
for (i = 0; i < 10; i++)
{
printf("%d ", a.Elements[i]);
}
getchar();
return 0;
} void Jiandanxuanze(List*lst)
{
int small;//存放最小元素下标
int i, j, temp;
for (i = 0; i<lst->Size - 1; i++)
{
small = i;
for (j = i + 1; j<lst->Size; j++)
{
if (lst->Elements[j]<lst->Elements[small])
small = j;//找到最小的元素的下标存在small
} temp = lst->Elements[i];
lst->Elements[i] = lst->Elements[small];
lst->Elements[small] = temp;//把最小的元素与最前的进行交换
}
}