一、简单选择排序
简单选择排序(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换。
1、code
/*对顺序表L作简单选择排序*/ Void SelectSort(SqList *L) { int i,j,min; for(i=1;i<L->length;i++) { min=i; /*将当前下标定义为最小值下标*/ for(j=i+1;j<=L->length;j++) { if(L->r[min]>L->r[i]) min=j; /*注意,这里是和冒泡排序的初级版不同的地方,这里并没有交换数据,而是记录下标*/ /*带来的好处就是减少交换次数,和避免了冒泡排序初级版把小数据交换到L末尾*/ } if(i!=min) swap(L,i,min); } }
二、直接插入排序
直接插入排序(Straight Insertion Sort)的基本操作时将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
1、code
/*对顺序表L作直接插入排序*/ void InsertSort(SqList *L) { int i,j; for(i=2;i<=L->length;i++) { if(L->r[i]<L->r[i-1]) { L->r[0]=L->r[i]; /*设置哨兵*/ for(j=i-1;L->r[j]>L->r[0];j--) /*必须保证i-1前面的L是有序的*/ L->r[j+1]=L->r[j]; /*记录后移*/ L->r[j+1]=L->r[0]; /*插入到正确的位置*/ } } }
三、希尔排序
1、基本思想
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
增量序列的最后一个增量必须等于1才行。
该方法实质上是一种分组插入方法,是直接插入排序的改进算法。
2、code
/*对序列表L作希尔排序*/ void ShellSort(SqList *L) { int i,j; int increment=L->length; do { increment =increment/3+1; /*增量序列,保证增量序列的最后一个增量等于1*/ for(i=increment+1;i<=L->length;i++) { if(L->r[i]<L->r[i-increment]) { L->r[0]=L->r[i]; /*暂存在L->r[0]中作为哨兵*/ for(j=i=increment;j>0 && L->r[0]<L->r[j];j-=increment) L->r[j+increment]=L->r[j]; /*记录后移,查找插入位置*/ L->r[j+increment]=L->r[0]; } } } while(increment>1) }