1、选择排序概念算法
选择排序(Selection Sort)的基本思想:对n个记录进行扫描,选择最小的记录,将其输出,接着在剩下的n-1个记录中扫描,选择最小的记录将其输出……不断重复这个过程,直到只剩一个记录为止,便可完成数据从小到大的排序过程。
提示:若是要求数据按从大到小排序,则每次扫描时选择最大的记录便可。
选择排序经常使用的算法有:简单选择排序和堆排序,本文介绍简单选择排序法,
简单选择排序法相似人的排序习惯:从数据中选择最小(或最大)的一个数据,而后将该数与第1个数交换,接下来从剩下数据中选择最小(或最大)的一个数,第2个数进行交换……这样重复下去,直到只剩下一个数据为止。
下面以一组待排序的数据演示简单选择排序的过程,假设有8个须要排序的数据序列以下所示:
69,65,90,37,92,6,28,54
使用简单选择排序法进行排序的过程以下图所示。数组
首先对数组中的原始数据进行扫描,找到最小的一个数6,与第1个元素69进行交换,完成第一遍选择排序的结果,而后不断重复这个过程,到第7遍扫描后,完成整个数据序列的排序。
注意:在简单选择排序法中,某一遍扫描没有数据交换并不能说明数据就已经按顺序排好了,还必须进行后续的扫描。测试
2、简单选择排序法的实现code
(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)测试io
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)运行结果class