1、序言
这是《漫谈经典排序算法系列》第一篇,该篇从最简单的选择排序算法谈起,由浅入深的详细解析两种选择排序算法的过程及性能比较。逐步揭露选择排序的本质及其基本思想。
各种排序算法的解析请参考如下:
注:为了叙述方便,本文以及源代码中均不考虑A[0],默认下标从1开始。
2、提出问题
(1)简单选择排序和堆排序的基本思想是什么?
(2)选择排序的本质是什么?
相信看完这篇文章,读者一定可以找到答案。
3、漫谈简单选择排序
3.1 从一个简单问题谈起
给定待排序序列A[ 1.....n ],选择出A中最小的记录(也可以理解为求一个无序数组A中的最小的元素)。下面给出代码如下:
//选择待排序序列a中的最小记录,其下标为index for(index=i=1;i<=n;i++){ if(a[i]<a[index]) index=i; }
相信这段代码大家都能看懂,其中A[index]即为要找的最小记录。也许有人要问作者是在写选择排序,干嘛要谈这个简单的问题呢?请不要急,看到后面自然就知道了。
3.2 简单选择排序的过程
描述:给定待排序序列A[ 1......n ] ,选择出第i小元素,并和A[i]交换,这就是一趟简单选择排序。
代码:
//简单选择排序 void simpleSelectionSort1(int *a,int n) { int i,j,index; //1.进行n-1趟选择,每次选出第i小记录 for(i=1;i<n;i++){ index=i; //2.选择第i小记录为a[index] for(j=i+1;j<=n;j++) if(a[j]<a[index]) index=j; //3.与第i个记录交换 if(index!=i){ a[i]=a[i]+a[index]; a[index]=a[i]-a[index]; a[i]=a[i]-a[index]; } } }
示例:假设给定数组A[1......6]={ 3,5,8,9,1,2 },我们来分析一下A数组进行选择排序的过程
第一趟:i=1,index=5, a[1] 和 a[5] 进行交换。得到序列:{ 1,5,8,9,3,2 }
第二趟:i=2,index=6, a[2] 和 a[6] 进行交换。得到序列:{ 1,2,8,9,3,5 }
第三趟:i=3,index=5, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,9,8,5 }
第四趟:i=4,index=6, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,5,8,9 }
第五趟:i=5,index=5, 不用交换。得到序列:{ 1,2,3,5,8,9 }
(6-1)趟选择结束,得到有序序列:{ 1,2,3,5,8,9 }