直接插入排序
2008-02-29 10:39
169 查看
直接插入排序是一种最简单的排序方法,它的基本思想是依次将每个记录插入到一个有序中去。就是说,第i(i>=1)遍整理时,A1,A2,...,Ai-1已经是排好序的子序列;取出第i个元素Ai,在已排好序的子序列为Ai找到一个合适的位置,并将它插到该位置上。易知上述排序当i=1时实际上为空操作,故可直接从i=2开始。
为了便于控制循环结束,引入元素A[0],行时可以节省时间,
直接插入排序的算法如下:
void strainsert(r,n)
int n,r; 结构类型
{
int i,j;
//外层循环标识并决定待比较的数值。
for(i=2;i<n;i++) //这里的i=2表示的是第2个元素
{
r[0]=r[i]; //待比较元素
j=i-1; //比较元素的前一项
//内层循环为待比较数值确定其最终位置
while( r[0].key < r[j].key ) //比较相邻的前项,如果满足条件,同时在和前项比较
{
r[j+1]=r[j]; //把前面大的项往前移一位
j=j-1;
}
r[j+1]=r[0];
}
}
初始序列:
i=1 [46] 58 15 45 90 18 10 62
↓
i=2 [46 58] 15 45 90 18 10 62
┌——┘
↓
i=3 [15 46 58] 45 90 18 10 62
┌——┘
↓
i=4 [15 45 46 58] 90 18 10 62
↓
i=5 [15 45 46 58 90] 18 10 62
┌—————┘
↓
i=6 [15 18 45 46 58 90] 10 62
┌————————┘
↓
i=7 [10 15 18 45 46 58 90] 62
┌—┘
↓
i=8 [10 15 18 45 46 58 62 90]
算法中引进附加记录A[0]有两个作用:其一是进入查找循环之前,它保存了A[ i ]的值,使得不致于因记录的后移而丢失A[ i ]中的内容;其二是在While循环"监视"下变量j是否越界,一旦越界(即j<1),A[0]自动控制While循环的结束,从而避免了在While循环中每一次都要检测j是否越界(即省略了循环条件"j>=1")。因此我们把称为"监视哨",这种技巧,使得测试循环条件的时间大约减少一半,对于记录数较大的文件,节约的时间相当可观。希望读者能掌握这种技巧。
由此可见,直接插入排序算法简洁,易理解,容易实现。当序列中的记录“基本有序”或n值较小时,它是最佳的排序方法。但是,通常待排记录的数量n很大,此时直接插入排序就不适用了。
为了便于控制循环结束,引入元素A[0],行时可以节省时间,
直接插入排序的算法如下:
void strainsert(r,n)
int n,r; 结构类型
{
int i,j;
//外层循环标识并决定待比较的数值。
for(i=2;i<n;i++) //这里的i=2表示的是第2个元素
{
r[0]=r[i]; //待比较元素
j=i-1; //比较元素的前一项
//内层循环为待比较数值确定其最终位置
while( r[0].key < r[j].key ) //比较相邻的前项,如果满足条件,同时在和前项比较
{
r[j+1]=r[j]; //把前面大的项往前移一位
j=j-1;
}
r[j+1]=r[0];
}
}
初始序列:
i=1 [46] 58 15 45 90 18 10 62
↓
i=2 [46 58] 15 45 90 18 10 62
┌——┘
↓
i=3 [15 46 58] 45 90 18 10 62
┌——┘
↓
i=4 [15 45 46 58] 90 18 10 62
↓
i=5 [15 45 46 58 90] 18 10 62
┌—————┘
↓
i=6 [15 18 45 46 58 90] 10 62
┌————————┘
↓
i=7 [10 15 18 45 46 58 90] 62
┌—┘
↓
i=8 [10 15 18 45 46 58 62 90]
算法中引进附加记录A[0]有两个作用:其一是进入查找循环之前,它保存了A[ i ]的值,使得不致于因记录的后移而丢失A[ i ]中的内容;其二是在While循环"监视"下变量j是否越界,一旦越界(即j<1),A[0]自动控制While循环的结束,从而避免了在While循环中每一次都要检测j是否越界(即省略了循环条件"j>=1")。因此我们把称为"监视哨",这种技巧,使得测试循环条件的时间大约减少一半,对于记录数较大的文件,节约的时间相当可观。希望读者能掌握这种技巧。
由此可见,直接插入排序算法简洁,易理解,容易实现。当序列中的记录“基本有序”或n值较小时,它是最佳的排序方法。但是,通常待排记录的数量n很大,此时直接插入排序就不适用了。
相关文章推荐
- 排序算法之直接插入排序
- 内排序-插入类排序-直接插入排序
- Java排序算法总结之(一)——插入排序(直接插入排序、折半插入排序、希尔排序)
- 数据结构_希尔排序(分组加直接插入排序)
- Java排序三:直接插入排序
- 排序系列--直接插入排序
- 简单选择排序与直接插入排序
- C# 直接插入排序
- 【数据结构】排序算法(一)之直接插入排序,冒泡排序
- 基本排序系列之直接插入排序
- 排序算法(堆排序,直接插入排序,折半插入排序,希尔排序)
- 直接插入排序
- java实现排序算法之2-路插入排序,直接插入排序,折半插入排序
- python数据结构之直接插入排序
- C# 常用排序方法 冒泡排序,直接选择排序,直接插入排序
- [排序算法2] - 直接插入排序
- JAVA排序算法---直接插入排序
- 【8086汇编】基础排序之直接插入排序
- 直接插入排序
- 三种最简单基础的排序 选择排序 冒泡排序 直接插入排序 运用了函数指针数组