排序算法之选择排序
从今天开始好好研究下排序算法,每一种排序算法都实现并分析。
排序的基本知识:文件的排序,这些文件包括数据项(item)和键(key),键是数据项的一个小部分,用于控制排序。排序算法的目的是重新组合数据项,使其键根据一些已经定义好的排序规则整齐排列。如果被排序的文件适合放在内存中,则排序算法被称为内部排序,从磁盘中对文件进行排序,称之为外部排序。
首先介绍的是一种最简单的排序算法。
选择排序 算法步骤:首先选出数组中最小的项,将它和数组的第一个成员交换(假如按照升序排列),然后选出次小的项,将其与第二个成员交换。按照这种思路一直做下去,直到整个数组排列完成。
实现源代码:
#include <iostream> #include <stdlib.h> using namespace std; template <typename Item> void exch(Item &A, Item& B) { Item t=A; A=B; B=t; } template <typename Item> void selection(Item a[],int l, int r) { for (int i=l;i<r;i++) { int min=i; //the index of the min value for (int j=i+1;j<=r;j++) { if (a[j]<a[min]) { min=j; } } exch(a[i],a[min]); } } void main() { int i; int N=10; int *a=new int[N]; int sw=1; if(sw) { for(i=0;i<N;i++) a[i]=1000*(1.0*rand()/RAND_MAX); } else { N=0; while(cin>>a[N]) N++; } for(i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; selection(a,0,N-1); for(i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; }
运行结果:
选择排序的一个缺点就是,他的运行时间和文件中已经有的排序关系很少。例如,改程序对已排好序的文件或者数据项都相同的文件排序所花的时间与对随机排列的文件排序所花的时间差不多。没有很好的利用输入文件数据项原有的序列。
虽然选择排序比较简单并且执行时间上具有强迫性,但是它对于数据项比较大而键值比较小的文件很实用,这时候移动数据所花的时间要比比较数据花的时间大的多,相比于其它的排序算法,选择排序移动数据的步数要比选择排序多的多。
(To Be Continued!)