数据结构考研 算法直接插入排序 C语言实现

考研-数据结构-C-算法-数组-排序-直接插入

 

语言:C语言 

对一维数组的直接插入排序,过程函数化。

什么是直接插入排序?

直接插入排序就是将某一个元素与顺序表中元素进行比较,然后插入到相应的位置,使整个顺序表处于有序状态。

对于插入排序,有三种方法:1.  直接插入排序2. 二分插入排序3.希尔排序

 

1.为了方便阅读、理解,采取初始化数组的形式输入。当然也是可以放一个输入函数,将数据从命令框中或者直接调用文件函数,从文件中读取,从而获取待排序的数据。

2.再者就是可以更改存储类型,定义一个LinkType的数据结构,将数据放在链表中。只是存储结构不同,算法的思想是一样的。

3.没有写C++或者Java的版本,算法的核心都是一样的,只要理解了核心思想,剩下的就是不同语言的表达了。

// 排序函数
int InsertSortFun(int array[],int length)
{
    int temp;
    int k;
    for(k=1;k<length;k++)     //从数组的第二个元素开始,终止于数组长度
    {
        temp=array[k];     //存放抽出来的元素A 
        int j=k;
        while(j>0&&array[j-1]>temp) //如果前一个元素大于A元素
        {
            array[j]=array[j-1];    //前一个元素往后移
            j--;
        }
        array[j]=temp;      //当前位置的原元素已往后移,把A元素填入
    }
}

 实现排序的基本操作有两个:

(1)“比较”序列中两个关键字的大小;

(2)“移动”记录。

性能分析:

最好的情况(关键字在记录序列中顺序有序):

“比较”的次数:

“移动”的次数:

0

最坏的情况(关键字在记录序列中逆序有序):

“比较”的次数:

“移动”的次数:

原始数据越接近有序,排序速度越快

最坏情况下(输入数据是逆有序的) Tw(n)=O(n2)

平均情况下,耗时差不多是最坏情况的一半 Te(n)=O(n2)

要提高查找速度

  1. 减少元素的比较次数

  2. 减少元素的移动次数

//  完整C代码
#include <stdio.h>
#include <stdlib.h>

#define arraysize 5

int InsertSortFun(int array[],int length)
{
    int temp;
    int k;
    for(k=1;k<length;k++)     //从数组的第二个元素开始,终止于数组长度
    {
        temp=array[k];     //存放抽出来的元素A 
        int j=k;
        while(j>0&&array[j-1]>temp) //如果前一个元素大于A元素
        {
            array[j]=array[j-1];    //前一个元素往后移
            j--;
        }
        array[j]=temp;      //当前位置的原元素已往后移,把A元素填入
    }
}

void PrintArray(int array[]){   //打印数组的函数 
	for(int i =0;i < arraysize ;i++)
	printf("%d ",array[i]);
}

int main(){
	
	int array[arraysize] = {1,3,3,5,4};   //初始化数组 
	InsertSortFun(array,arraysize);   //调用排序函数 
	PrintArray(array);   //打印数组,进行输出 
	return 0;
} 

运行结果:

注:希望各位同行批评指正,多多交流,也希望能够帮助广大研友们。

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

byzf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值