【算法】简单选择排序 O(n^2) 不稳定的 C语言
简单选择排序
一、算法描述
假设序列中有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;//把最小的元素与最前的进行交换 
	}
}
   
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号