码迷,mamicode.com
首页 > 编程语言 > 详细

内部排序——插入类排序——直接插入排序

时间:2015-07-11 16:51:35      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

直接插入排序

算法思想:直接插入排序是一种最基本的插入排序方法,其基本操作是将第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;
}

运行结果如下
技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

内部排序——插入类排序——直接插入排序

标签:

原文地址:http://blog.csdn.net/u013087513/article/details/46841717

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!