简单选择排序(Simple Selection Sort)

基本思想:排序时找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作。即通过n-i次关键字间的比较,从n-i+1(i=1,2,...n-1)个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。

void SelectSort(SqList *L);

实现代码如下:

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int Status; 

#define MAXSIZE 10000  /* 用于要排序数组个数最大值,可根据需要修改 */
typedef struct
{
	int r[MAXSIZE+1];	/* 用于存储要排序数组,r[0]用作哨兵或临时变量 */
	int length;			/* 用于记录顺序表的长度 */
}SqList;

void print(SqList L)
{
	int i;
	for(i=1;i<L.length;i++)
		printf("%d,",L.r[i]);
	printf("%d",L.r[i]);
	printf("\n");
}

/* 交换L中数组r的下标为i和j的值 */
void swap(SqList *L,int i,int j)
{
	int temp=L->r[i];
	L->r[i]=L->r[j];
	L->r[j]=temp;
}

/* 对顺序表L作简单选择排序 */
void SelectSort(SqList *L)
{
	int i,j,min;
	for(i=1;i<L->length;i++)
	{
		min = i;						/* 将当前下标定义为最小值下标 */
		for (j = i+1;j<=L->length;j++)/* 循环之后的数据 */
		{
			if (L->r[min]>L->r[j])	/* 如果有小于当前最小值的关键字 */
				min = j;				/* 将此关键字的下标赋值给min */
		}
		if(i!=min)						/* 若min不等于i,说明找到最小值,交换 */
			swap(L,i,min);				/* 交换L->r[i]与L->r[min]的值 */
	}
}

#define  N 9
int _tmain(int argc, _TCHAR* argv[])
{
	int d[N]={9,1,5,8,3,7,4,6,2};
	SqList L0;
	int i;
	for(i=0;i<N;i++)
		L0.r[i+1]=d[i];
	L0.length=N;

	printf("排序前:\n");
	print(L0);

	SelectSort(&L0);
	printf("排序后:\n");
	print(L0);

	getchar();
	return 0;
}

从简单选择排序的过程来看,它最大的特点就是交换移动数据次数相当少,这样也就节约了相应的时间。分析它的时间复杂度发现,无论最好最差的情况,其比较次数都是一样的多,第i趟排序需要进行n-i次关键字的比较。此时需要比较次。而对于交换次数而言,当最好的时候,交换为0次,最差的时候,也就初始降序时,交换次数为n-1次,基于最终的排序时间是比较与交换的次数总和,因此,总的时间复杂度依然为。

应该说,尽管与冒泡排序同为。但简单选择排序的性能上还是要略优于冒泡排序。

时间: 2024-11-11 20:22:38

简单选择排序(Simple Selection Sort)的相关文章

数据结构 - 简单选择排序(simple selection sort) 详解 及 代码(C++)

数据结构 - 简单选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取关键字最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次关键字之间的比较, 从n-i+1个记录中选出关键字最小的记录, 并和第i个记录交换. 选择排序需

数据结构 - 只需选择排序(simple selection sort) 详细说明 和 代码(C++)

数据结构 - 只需选择排序(simple selection sort) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28601965 选择排序(selection sort) : 每一趟在n-i+1个记录中选取keyword最小的记录作为有序序列中第i个记录. 简单选择排序(simple selection sort) : 通过n-i次keyword之间的比較, 从n-i+1个记录中选出keyword最小的记录, 并和第i

选择排序(Selection sort)

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 简单的可以理解为:将整个数组视为虚拟的有序区和无序区,重复的遍历数组,每次遍历从无序区中选出一个最小(或最大)的元素,放在有序区的最后,每一次遍历排序过程都是有序区元素个数增加,无序区元素个数减少的过程,直到无序区元素个数位0. 选择排序的

选择排序法(Selection Sort) 复习--附图示说明

先看看图示了解 Selection Sort 是怎麽完成的 最後完成了- 了解了它的行为模式以後,我们可以开始写代码实现了 import java.util.Arrays; public class testMain { public static void main(String[] args) { int[] randArray = new int[] { 2, 0, 1, 3, 9, 8, 6, 5, 4, 7 }; insertionSort(randArray); System.out

数据结构 - 树形选择排序 (tree selection sort) 详解 及 代码

http://blog.csdn.net/yj_1989/article/details/46598579http://blog.csdn.net/yj_1989/article/details/46598581http://blog.csdn.net/yj_1989/article/details/46598605http://blog.csdn.net/yj_1989/article/details/46598607http://blog.csdn.net/yj_1989/article/d

常见排序算法导读(3)[简单选择排序]

这一节将介绍简单选择排序(Simple Selection Sort). 在介绍简单排序算法之前,先给出排序的确切定义,并简单介绍一下排序算法的稳定性. 排序的确切定义 假设含有n个对象的序列为{R[0], R[1], ..., R[n-1]}, 其对应的关键字(key)序列为{K[0], K[1], ..., K[n-1]}. 所谓排序, 就是确定0, 1, ..., n-1的一种排列p[0], p[1], ..., p[n-1], 使各个关键字满足如下的非递减(升序)或非递增(降序)关系:

简单选择排序

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 选择排序不稳定,会导致相同值位置发生改变. 算法步骤: 1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾. 3)重复第二步,直到所有元素均排序完毕. public class SelectionSort { publi

简单选择排序(Simple Selection Sort)的C语言实现

简单选择排序(Simple Selection Sort)的核心思想是每次选择无序序列最小的数放在有序序列最后 演示实例: C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 1 #include <stdio.h> 2 #define LEN 6 3 4 typedef float keyType; 5 6 typedef struct{ 7 keyType score;

八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止. 简单选择排序的示例: 操作方法: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推..... 第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与