基本思想:排序时找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作。即通过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