一、选择排序概念
选择排序(Selection Sort)的基本思想:对n个记录进行扫描,选择最小的记录,将其输出,接着在剩下的n-1个记录中扫描,选择最小的记录将其输出……不断重复这个过程,直到只剩一个记录为止,即可完成数据从小到大的排序过程。
提示:如果要求数据按从大到小排序,则每次扫描时选择最大的记录即可。
选择排序常用的算法有:简单选择排序和堆排序,本文介绍简单选择排序法,
简单选择排序法类似人的排序习惯:从数据中选择最小(或最大)的一个数据,然后将该数与第1个数交换,接下来从剩下数据中选择最小(或最大)的一个数,第2个数进行交换……这样重复下去,直到只剩下一个数据为止。
下面以一组待排序的数据演示简单选择排序的过程,假设有8个需要排序的数据序列如下所示:
69,65,90,37,92,6,28,54
使用简单选择排序法进行排序的过程如下图所示。
首先对数组中的原始数据进行扫描,找到最小的一个数6,与第1个元素69进行交换,完成第一遍选择排序的结果,然后不断重复这个过程,到第7遍扫描后,完成整个数据序列的排序。
注意:在简单选择排序法中,某一遍扫描没有数据交换并不能说明数据就已经按顺序排好了,还必须进行后续的扫描。
二、简单选择排序法的实现
(1)实现
void SelectSort(int a[], int n)
{
int i, j, t, k;
for (i=0; i<n; i++) {
k = i; //记录和第k个元素交换位置
for (j=i+1; j<n; j++) {//查找最小数据,保存其序号在k中
if (a[j] < a[k])
k = j;
}
t = a[i]; //交换最小数据到数组前面
a[i] = a[k];
a[k] = t;
}
}
(2)测试
void ShowData(int arr[], int n)
{
int i;
for (i=0; i<n; i++)
printf("%d ", arr[i]);
printf("\n");
return;
}
#define ARRAYLEN 10
int main(int argc, char *argv[])
{
int i;
int a[ARRAYLEN] = {94, 84, 54, 80, 62, 83, 37, 24, 67, 29};
printf("原数据:");
ShowData(a, ARRAYLEN);
SelectSort(a, ARRAYLEN);
printf("排序后:");
ShowData(a, ARRAYLEN);
return 0;
}
(3)运行结果
来源:oschina
链接:https://my.oschina.net/u/2294938/blog/687724