第10章 简单选择排序

简单选择排序 (Simple Selection Sort ,又称为直接选择排序) 的基本操作是:通过 nin-in−i 次关键字间的比较,从 ni+1n-i+1n−i+1 个记录中选取关键字最小的记录,然后和第 iii 个记录进行交换,i=1,2,n1i=1, 2, … n-1i=1,2,…n−1。

排序示例:设有关键字序列为:7, 4, -2, 19, 13, 6,直接选择排序的过程如下图10-8所示。

第10章 简单选择排序

完整代码如下:

#include <stdio.h>

#define	TRUE		1			//真 
#define	FALSE		0			//假
#define	OK			1			//通过
#define	ERROR		0			//错误
#define MAXSIZE 20					//用作示例的顺序表的最大长度
#define LT(a,b) ((a)<(b))					
#define LQ(a,b) ((a)<=(b))
typedef int Status;

/* 记录类型 */
typedef int KeyType;				//定义关键字类型为整数类型
typedef struct						//顺序表结构 
{
	KeyType key;					//关键字项 
	//使用结构体便于使用中扩展 
}RcdType;

/* 顺序表类型 */
typedef struct
{
	RcdType r[MAXSIZE+1];			//r[0]闲置或用作哨兵单元
	int length;						//顺序表长度 
}SqList_sort;

//1.创建一个任意顺序的序列。
Status CreateSortList(SqList_sort *L)
{
	printf("请输入元素个数:"); 
	scanf("%d", &((*L).length));
	
	if((*L).length > MAXSIZE)
		return ERROR;
	printf("请依次输入元素的关键字:\n"); 
	for(int i = 1; i <= (*L).length; i++)
		scanf("%d", &((*L).r[i].key));

	return OK;
}

//2.输出序列L。
void Traverse(SqList_sort L)
{
	for(int i = 1; i <= L.length; i++)
		printf("%d ", L.r[i].key);	
	printf("\n");
}

//3.在L.r[i..L.length]中选择key最小的记录。
int SelectMinKey(SqList_sort L, int i)
{
	int min, k;
	
	min = i;
	L.r[0] = L.r[i];
	
	for(k = i; k <= L.length; k++)
	{
		if(L.r[k].key<L.r[0].key)
		{
			min = k;
			L.r[0] = L.r[k];		
		}
	}
	
	return min;
}

//4.算法10.9:对顺序表L作简单选择排序。 
void SelectSort(SqList_sort *L)
{
	int i, j;
	RcdType tmp;
	
	for(i = 1; i < (*L).length; i++)
	{
		j = SelectMinKey(*L, i);
		
		if(i!=j)
		{
			tmp = (*L).r[i];
			(*L).r[i] = (*L).r[j];
			(*L).r[j] = tmp;
		}
	}
}

int main(int argc, char *argv[])
{
	SqList_sort L;
	
	CreateSortList(&L);
	
	SelectSort(&L);
	Traverse(L);
	printf("\n");
	
	return 0;
}
第10章 简单选择排序第10章 简单选择排序 菜是原罪QAQ 发布了655 篇原创文章 · 获赞 100 · 访问量 10万+ 他的留言板 关注
上一篇:算法初赛第十五题


下一篇:[POI2001] 和平委员会