#C02L04P01. C02.L04.选择排序.原理讲解

C02.L04.选择排序.原理讲解

今天,数学老师找到了明明,让他把 1000 个学生的数学成绩按从高分到低分输入电脑。

就像我们排队是从高到矮一样,将同一类型的数据按一定顺序(从大到小或从小到大)排列称为排序。排序的算法有很多,其中选择排序是一种较简单的方法。

例如:输入 5 个正整数,把这 5 个数按由大到小的顺序排列。

分析:要把5个数按从大到小顺序排列,则排完后,第一个数最大,第二个数次大,...... 。因此,我们第一步可将第一个位置的数与其后的各个数依次比较,若发现有数比它大的,则互相交换位置,这样结束后,第一个位置的数就是最大的数。

原始数据

下标 1 2 3 4 5
数据 20 10 50 40 60

用1号数据和后面2到5号的数据依次比较,确定 “第一大” 的数据。

第一次是 1 号和 2 号比较,20 > 10,所以数据不变。
img

第二次是 1 号和 3 号比较,20 < 50,所以交换数据。
img

第三次是 1 号和 4 号比较,50 > 40,所以数据不变。
img

第四次是 1 号和 5 号比较,50 < 60, 所以数据交换。
img

做完上面的事情之后,确定第一大的数据是 60,而且最大的数据已经放在了最前面的位置。

下标 1 2 3 4 5
数据 60 10 20 40 50

用 2 号数据和后面 3 到 5 号的数据比较,确定 “第二大”的 数据。

确定第二大的数据是 50

下标 1 2 3 4 5
数据 60 50 10 20 40

......

经过多轮比较,最后确定的顺序是:

下标 1 2 3 4 5
数据 60 50 40 20 10

这种排序方法叫选择排序:(从大到小)

for (int i=1;i<=n-1;i++)    //确定第i个位置的数据
	for(int j=i+1;j<=n;j++)   //将第i个数与其后所有数比较
		if (a[i]<a[j])          //若a[j]比a[i]大,则交换数据
		{
			t=a[i];
			a[i]=a[j];
			a[j]=t;
		}