直接插入排序
(Straight Insertion sort)
基本思想:把数组中待排序的n个元素看成一个有序表和无序表,开始时有序表只有一个元素,而元素表中包含有n-1个元素。排序过程中,每次取出无序表中第一个元素,将它插入到有序表的适当位置上,使之成为一个新的有序表,这样经过n-1次的插入后,无序表变成为空表,而有序表包含有n个元素,至此排序完毕。
存在的问题:如何将一个记录数插入到当前的有序区,并使插入后该区间的记录按关键字仍然有序。
第一种略
第二种方法:从有序表的表尾开始将记录查找和移动交替地进行。
具体做法:将待插入的记录关键字key从右到左依次与有序表中记录关键字进行比较。
假如数组R有8个待排序的记录,它们的关键字分别是
(56,26,47,10,60,40,20,30)
趟数: R[0]
0 i=1 (56) [56] 26 47 10 60 40 20 30
1 i=2 (26) [ 26 56] 47 10 60 40 20 30
2 i=3 (47) [ 26 47 56 ] 12 65 41 20 30
3 i=3 (12) [ 12 26 47 56 ]65 41 20 30
4 i=3 (65) [ 12 26 47 56 65 ]41 20 30
5 i=3 (41) [ 12 26 41 47 56 65] 20 30
6 i=3 (20) [ 12 20 26 41 47 56 65] 30
7 i=3 (36) [ 12 20 26 30 41 47 56 65 ]
排序算法:
Insert_sort(r) \\直接插入排序
Rectype r[];{
Int i,j,n=NUM; \\NUM为实际输入记录数
For(i=1;i<n;i++){
r[0]=r[i];
j=i-1;
while(r[0].key<r[j].key) \\查找r[i]合适的插入位置
r[j+1]=r[j--]; \\记录大于r[i].key后移
r[j+1]=r[0]; \\r[i]插入到有序表的合适位置
}
}
**注意r[j--],先赋值在进行自减
仔细观察就会发现实际是从r[1]开始的,r[0]起一个监视作用,当数据过大过多的时候,会使测试的时间减少近一半。
#include"stdio.h"
#define N 9
int main(){
int a[N]={0,56,26,47,10,60,40,20,30};
int i,j;
for(i=1;i<N;i++){
a[0]=a[i];
j=i-1;
while(a[0]<a[j])
a[j+1]=a[j--];
a[j+1]=a[0];
}
a[0]=0;
for(int b=0;b<N;b++)
printf("%3d",a[b]);
}