再一次拿出笔记本,再一次看老师给我们讲的经典课程笔记。看着笔记,脑海浮现的是老师当年讲课的情景,想到的是老师挂在嘴边的那句话:“其实,不就是两个三角形嘛!想到排序,就想两个三角形,肯定错不了!”。
这句话,确实有效,每次看到排序,都能很自然的想到,两个三角形!
那两个三角形到底是什么意思?我们来看一看!
这是我当时听课时自己画的两个简单的示意图,虽然简陋,但就像两张图片,一直存储在脑中!
两张图待补充!
当时我们刚刚接触程序设计,根本不知道什么是算法,提到算法就想躲,因为我们的印象是,它太难了。
经过那节课,老师告诉我们算法,不难!
现在来重温一下当年的知识。
选择排序法:(以从小到大排序为例)
基本原理:选择排序的基本原理是这样的,首先假设第一个数小的,让第一个数依次和之后的数比较大小,如果后面的数有比第一个数小的,则把它放在第一个数的位置。例如:3,4,2,1,5,6,7这几个数从小到大排序,假设第一个数是最小的,让第一个数与第二个数比较,如果第二个数比第一个数小,则把第二个数放在第一个数的位置。然后第一个位置上的数和第三个数比较,同理,依次进行。
因为每次都是第一个位置上的数在和后面的数比较(交换),所以一圈下来,第一个位置上肯定是最小的那个数。第二次则是让第二个位置上的数与后面的所有数比较(交换),第二圈的比较就和第一个位置没有关系了(因为第一个已经是所有数中最小的),这样每次都向后缩进一个位置,全部画出,就得出了我们上面的三角形图像。
代码实现
void SelectSortArray()
{
int min_index;
for(int i=0;i<n-1;i++)
{
min_index=i;
for(int j=i+1;j<n;j++)//每次扫描选择最小项
if(arr[j]<arr[min_index]) min_index=j;
if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置
{
int temp;
temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;
}
}
}
冒泡排序法:
基本原理:冒泡排序和选择排序有点类似,它是两个两个相互比较,而不是用一个位置与其他所有的位置比较。还是上面那个例子:3,4,2,1,5,6,7这几个数从小到大排序。冒泡排序是首先第一个与第二个比较,如果第一个比第二个大,则两个数交换位置,然后拿第二个去与第三个比较,将大的放在后面。注意,这个时候我们不知道第三个(交换前)与第一个谁大谁小,我们只是把他们三个中最大的放在了后面,而不管其他两个。这时最大的那个数,就像浮力大一样,一直交换,直到到达水面,这就是冒泡法名字的来源。
代码实现:
void BubbleSortArray()
{
for(int i=1;i<n;i++)
{
for(int j=0;i<n-i;j++)
{
if(a[j]>a[j+1])//比较交换相邻元素
{
int temp;
temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;
}
}
}
}
这两个算法虽然很简单,效率也较差,但是确是我们编程入门所必需的知识,是我们必须要理解的基本功。但事实上我们好多人一直在用排序法,可真正问到他们用的是选择还是冒泡的原理的时候,有几个人能说出来。这就像建一座高楼大厦,我们不清楚我们使用的是什么设计思想,即使我们也把楼建成了,我们也算不上是建筑大师!