直接插入排序算法

直接插入排序

(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]);
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值