希尔排序的完整算法如下 void shellsort(Data Type a, int n) for(d=n/2;d>=1;d=d/2) for(i=l+d; i<=n;i++) /将a插入到所属组的有序列段中 a[]=ai]; j=i-d; while(jo&&a[o key<aj. key) i altd=alji aj+d=ao 请单赤鼠标左键换页!
希尔排序的完整算法如下: void shellsort(DataType a,int n) { for(d=n/2;d>=1;d=d/2) { for(i=1+d;i<=n;i++) //将a[i]插入到所属组的有序列段中 { a[0]=a[i]; j=i-d; while(j>0&&a[0].key<a[j].key) { a[j+d]=a[j]; j=j-d; } a[j+d]=a[0]; } }
在希尔排序中,由于开始将n个待排序的记录分成 了d组,所以每组中的记录数目将会减少。在数据量较 少时,利用直接插入排序的效率较高。随着反复分组 排序,d值逐渐变小,每个分组中的待排序记录数目将 会增多,但此时记录的排列顺序将更接近有序,所以 利用直接插入排序不会降低排序的时间效率。 希尔排序适用于待排序的记录数目较大时,在此 情况下,希尔排序方法一般要比直接插入排序方法快。 同直接插入排序一样,希尔排序也只需要一个记录大 小的辅助空间,用于暂存当前待插入的记录。 希尔排序是一种不稳定的排序方法。 请单赤鼠标左键换页!
在希尔排序中,由于开始将n个待排序的记录分成 了d组,所以每组中的记录数目将会减少。在数据量较 少时,利用直接插入排序的效率较高。随着反复分组 排序,d值逐渐变小,每个分组中的待排序记录数目将 会增多,但此时记录的排列顺序将更接近有序,所以 利用直接插入排序不会降低排序的时间效率。 希尔排序适用于待排序的记录数目较大时,在此 情况下,希尔排序方法一般要比直接插入排序方法快。 同直接插入排序一样,希尔排序也只需要一个记录大 小的辅助空间,用于暂存当前待插入的记录。 希尔排序是一种不稳定的排序方法
8.3交换排序 交换排序是指在排序过程中,主要是通过待排序 记录序列中元素间关键字的比较,与存储位置的交换 来达到排序目的一类排序方法。 8.3.1冒泡排序 1.冒泡排序的基本思想 冒泡排序是交换排序中一种简单的排序方法。它的 基本思想是对所有相邻记录的关键字值进行比效,如 果是逆顺(aj}ai+1),则将其交换,最终达到有序 化。其处理过程为 请单赤鼠标左键换页!
8.3 交换排序 交换排序是指在排序过程中,主要是通过待排序 记录序列中元素间关键字的比较,与存储位置的交换 来达到排序目的一类排序方法。 8.3.1 冒泡排序 1. 冒泡排序的基本思想 冒泡排序是交换排序中一种简单的排序方法。它的 基本思想是对所有相邻记录的关键字值进行比效,如 果是逆顺(a[j]>a[j+1]),则将其交换,最终达到有序 化。其处理过程为:
(1)将整个待排序的记录序列划分成有序区和无 序区,初始状态有序区为空,无序区包括所有待排序 的记录。 (2)对无序区从前向后依次将相邻记录的关键字 进行比较,若逆序将其交换,从而使得关键字值小的 记录向上“飘浮”(左移),关键字值大的记录好像 石块,向下“堕落”(右移)。 每经过一趟冒泡排序,都使无序区中关键字值最 大的记录进入有序区,对于由n个记录组成的记录序列, 最多经过n-1趟冒泡排序,就可以将这n个记录重新按 关键字顺序排列。 请单赤鼠标左键换页!
(1)将整个待排序的记录序列划分成有序区和无 序区,初始状态有序区为空,无序区包括所有待排序 的记录。 (2)对无序区从前向后依次将相邻记录的关键字 进行比较,若逆序将其交换,从而使得关键字值小的 记录向上“飘浮”(左移),关键字值大的记录好像 石块,向下“堕落”(右移)。 每经过一趟冒泡排序,都使无序区中关键字值最 大的记录进入有序区,对于由n个记录组成的记录序列, 最多经过n-1趟冒泡排序,就可以将这n个记录重新按 关键字顺序排列
3.冒泡排序算法 原始的冒泡排序算法 对由n个记录组成的记录序列,最多经过(m1) 趟冒泡排序,就可以使记录序列成为有序序列,第 趟定位第n个记录,此时有序区只有一个记录;第二趟 定位第n-1个记录,此时有序区有两个记录;以此类推, 算法框架为: for (i=n: i>l: i-) 定位第个记录; 请单鼠标左键换页!
3. 冒泡排序算法 原始的冒泡排序算法 对由n个记录组成的记录序列,最多经过(n-1) 趟冒泡排序,就可以使记录序列成为有序序列,第一 趟定位第n个记录,此时有序区只有一个记录;第二趟 定位第n-1个记录,此时有序区有两个记录;以此类推, 算法框架为: for(i=n;i>1;i--) { 定位第i个记录; }