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

 

简单选择排序

 一、算法描述                                                     

 

假设序列中有N个元素:

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

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

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

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

N趟(最后一趟)找到第NN个元素之间最小的一个(即最后一个元素),与第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;//把最小的元素与最前的进行交换 
	}
}






posted @ 2015-11-06 23:30  Ahair  阅读(661)  评论(0编辑  收藏  举报