排序——简单选择排序

两盒软妹~` 提交于 2019-11-28 20:00:44

一、选择排序概念

选择排序(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)运行结果

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!