直接插入排序
算法思想:直接插入排序是一种最基本的插入排序方法,其基本操作是将第i个记录插入到前面i-1个已排好序记录中。具体过程为:将第i个记录的关键字Ki,依次与前面记录的关键字K(i-1),K(i-2),,,,K1进行比较,将所有关键字大于Ki的关键字记录依次向后移动一个位置,直到遇见一个关键字小于或等于Ki的记录Kj此时Kj后面必为空位置,将第i个记录插入空位置即可。完整地插入排序是从i=2开始的。i从2到n可实现完整地直接插入排序。
第一种带有监视哨的排序方法:将记录存放在r[1-length]之中,为了提高效率附设一个监视哨r[0],使得r[0]始终存放待插入的记录。监视哨的作用有两个:一是备份待插入的记录,以便前面关键字较大的记录后移。二是防止越界。
第二种是不带有监视哨的方法:将记录存放在r[0—length-1]之中,必须附设一个相同类型的记录变量来存储待插入的记录,此时寻找插入位置时必须加判断语句以防止越界。
在order.c中编辑代码如下
//
// sxh.c
// TIAOSHI
//
// Created by 就不告诉你我是谁 on 15-7-10.
// Copyright (c) 2015年 刘勋. All rights reserved.
//
#include <stdio.h>
typedef int KeyType;
typedef struct {
KeyType key;
// othertype other_data
}RecordType;
void output(RecordType a[],int b,int len){//依次输出从a数组以下标b开始的len个数据
for (int i=b; i<b+len; i++) {
printf("%4d",a[i].key);
}
printf("\n");
}
void InSort(RecordType r[],int length){ //注意:此r数组的使用范围是从1到length
//对记录数组r做直接插入排序,length为数组中待排序记录的数目
int j;
for (int i=2; i<=length; i++) {
r[0]=r[i]; j=i-1; //将待插入记录放到监视哨r[0]中
while (r[0].key<r[j].key) { //寻找插入位置
r[j+1]=r[j]; j=j-1; }
r[j+1]=r[0];//将待插入的记录插入到已排序的记录序列中
}
}
void InSort1(RecordType r[],int length){ //注意:此r数组的使用范围从0到length-1
//对记录数组r做直接插入排序,length为数组中待排序记录的数目
int j; RecordType t;
for (int i=1; i<length; i++) { //将待插入记录放到中间变量t中
t=r[i]; j=i-1;
while (t.key<r[j].key&&j>=0) {
r[j+1]=r[j];j=j-1;
}
r[j+1]=t;
}
}
在order.h的头文件中声明函数如下
//
// sxh.h
// TIAOSHI
//
// Created by 就不告诉你我是谁 on 15-7-10.
// Copyright (c) 2015年 刘勋. All rights reserved.
//
#ifndef TIAOSHI_sxh_h
#define TIAOSHI_sxh_h
typedef int KeyType;
typedef struct {
KeyType key;
// othertype other_data
}RecordType;
void output(RecordType a[],int b,int len);
void InSort(RecordType r[],int length);
void InSort1(RecordType r[],int length);
#endif
最后在main.c的主函数中包含头文件 代码如下:
//
// main.c
// TIAOSHI
//
// Created by 就不告诉你我是谁 on 15-7-10.
// Copyright (c) 2015年 刘勋. All rights reserved.
//
#include <stdio.h>
#include "order1.h"
int main(int argc, const char * argv[])
{
RecordType a[9]={0,48,62,35,77,55,14,35,98};
RecordType b[8]={48,62,35,77,55,14,35,98};
output(a, 1, 8);
output(b, 0, 8);
InSort(a, 8);
output(a, 1, 8);
InSort1(b, 8);
output(b, 0, 8);
return 0;
}
运行结果如下