1.2.1直接插入排序 假设待排序的记录存放在数组R0.n-1中,排序过程的某一中 间时刻,R被划分成两个子区间R0.i1和R[in-1,其中:前一 个子区间是已排好序的有序区后一个子区间则是当前未排序 的部分不妨称其为无序区。直接插入排序的基本操作是将当 前无序区的第1个记录R插入到有序区R0.1中适当的位置 上,使R0.变为新的有序区。这种方法通常称为增量法,因为 它每次使有序区增加1个记录 直接插入排序的算法如下:
11.2.1 直接插入排序 假设待排序的记录存放在数组R[0..n-1]中,排序过程的某一中 间时刻,R被划分成两个子区间R[0..i-1]和R[i..n-1],其中:前一 个子区间是已排好序的有序区,后一个子区间则是当前未排序 的部分,不妨称其为无序区。直接插入排序的基本操作是将当 前无序区的第1个记录R[i]插入到有序区R[0..i-1]中适当的位置 上,使R[0..i]变为新的有序区。这种方法通常称为增量法,因为 它每次使有序区增加1个记录。 直接插入排序的算法如下:
void insertsort( RecType ri,int-n)/对R0.,n-1按递增有序进行 直接插入排序* int Rectype temp; for(i=l; i<n; i++) i temp=R; j=i1;/从右向左在有序区R0.i-1找R[的插入位置* while (i>=0 & temp key<riil. key) R+1=Rji;/将关键字大于R[key的记录后移*/ Ri+1temp;/在j+1处插入R[/
void InsertSort(RecType R[],int n) /*对R[0..n-1]按递增有序进行 直接插入排序*/ { int i,j; RecType temp; for (i=1;i<n;i++) { temp=R[i]; j=i-1; /*从右向左在有序区R[0..i-1]找R[i]的插入位置*/ while (j>=0 && temp.key<R[j].key) { R[j+1]=R[j]; /*将关键字大于R[i].key的记录后移*/ j--; } R[j+1]=temp; /*在j+1处插入R[i]*/ } }
例11设待排序的表有10个记录其关键字分别为 9,8,76,5,4,3,2,1,0}。说明采用直接插入排序方法进行排序的 过程。 初始关键字9876432 i-289654 21 i=3 8954 7894 3333 21 2 i=5 67891 21 =6 3I 5678921 =7 765432 543 654 0000000009 i=8 6789 12 5678
例11.1 设待排序的表有10个记录,其关键字分别为 {9,8,7,6,5,4,3,2,1,0}。说明采用直接插入排序方法进行排序的 过程。 初始关键字 9 8 7 6 5 4 3 2 1 0 i=1 [8 9] 7 6 5 4 3 2 1 0 i=2 [7 8 9] 6 5 4 3 2 1 0 i=3 [6 7 8 9] 5 4 3 2 1 0 i=4 [5 6 7 8 9] 4 3 2 1 0 i=5 [4 5 6 7 8 9] 3 2 1 0 i=6 [3 4 5 6 7 8 9] 2 1 0 i=7 [2 3 4 5 6 7 8 9] 1 0 i=8 [1 2 3 4 5 6 7 8 9] 0 i=9 [0 1 2 3 4 5 6 7 8 9]
11.2.2希尔排序 希尔排序也是一种插入排序方法实际上是一种分组插入方法。 其基本思想是:先取定一个小于n的整数d1作为第一个增量,把 表的全部记录分成d个组所有距离为d1的倍数的记录放在同 个组中,在各组内进行直接插入排序;然后取第二个增量d24(< d1),重复上述的分组和排序,直至所取的增量d=1(d4d K…<d2<d1即所有记录放在同一组中进行直接插入排序为止 希尔排序的算法如下:
11.2.2 希尔排序 希尔排序也是一种插入排序方法,实际上是一种分组插入方法。 其基本思想是:先取定一个小于n的整数d1作为第一个增量,把 表的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一 个组中,在各组内进行直接插入排序;然后,取第二个增量d2 (< d1 ), 重 复 上 述 的 分 组 和 排 序 , 直 至 所 取 的 增 量 dt =1(dt<dt- 1<…<d2<d1 ),即所有记录放在同一组中进行直接插入排序为止。 希尔排序的算法如下:
void Shellsort( RecType rubin n)/希尔排序算法 int i,j, d; RecType temp; d=n/2 /d取初值n/2* while(d>o for(i=d;i<n;i+)/将Rdn-1分别插入各组当前有序区 i j=i-d while (i>=0 & riikey>R[j+d. key {temp=Rjl;/R与Rj计d交换* RIl-R+d; rlj+d=temp; d=d/2; /递减增量d*
void ShellSort(RecType R[],int n) /*希尔排序算法*/ { int i,j,d;RecType temp; d=n/2; /*d取初值n/2*/ while (d>0) { for (i=d;i<n;i++) /*将R[d..n-1]分别插入各组当前有序区*/ { j=i-d; while (j>=0 && R[j].key>R[j+d].key) { temp=R[j]; /*R[j]与R[j+d]交换*/ R[j]=R[j+d];R[j+d]=temp; j=j-d; } } d=d/2; /*递减增量d*/ } }