算法导论学习:插入排序法的实现

        今天开始我的算法学习之旅(虽然参加比赛的时候学习过遗传算法,蚁群算法这些玩意儿),拿到《算法导论》这本书,我的内心是绝望的,真的厚抓狂。。。。。可是还是抑制不住自己对学习算法的渴望。。。可以了,这些套话我再也不想说了,哼,代码见!!!

第二章 算法基础

1. 插入排序

        一谈到排序,大家心中都有自己常用的一种,什么直接插入排序,冒泡排序,归并排序,堆排序,选择排序等等。排序算法是最基本的算法,很多场合都需要使用。因此,我今天也从零学起,写一个最简单直接插入排序算法。

        插入排序思想:(借用算法导论中的例子,很形象)插入排序就好比打扑克时摸牌的过程。当你从桌上的牌堆中摸取第一张牌时,你把它放在左手中,当你摸取第二张牌时,你会先把这张牌和手中的牌作比较,比较完后,按大小插入其中,当你摸取第三张牌时,你会与你左手中的两张牌依次做比较,按照大小插入其中,依次类推,最终排完顺序。

         插入排序时间空间复杂度:时间复杂度O(n2),空间复杂度为O(1)。对于数组元素少的情况,直接插入排序法高效,对于大数据排序,这种方法就不适用了,更好的方法可以采取归并排序等算法。

        编写调试过程中的问题:程序中采用的是数字地址传递的方式,排序函数中需要用到数组长度,如果直接在函数中调用ARRAY_LENGTH是不行的,你可以自己调试试试,因为传过去的只是数组首地址,你若调用ARRAY_LENGTH,结果只能为1,所以结果不对。因此,程序中因采取在主函数中获取数组长度,之后以参数的形式传入到排序函数中。(这是我调试时遇到的一个问题,虽然很不起眼,但是这个问题浪费了我10分钟时间去解决,最终才发现原因,很无奈!!!大哭

       下面是我编写的程序(与算法导论中的伪代码一致)

        程序运行平台 VS2012,程序中采用随机数方式生成任意数进行排序。采用宏定义方式定义数组长度获取函数。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ARRAY_LENGTH(array,len) {len=sizeof(array)/sizeof(array[0]);}    //宏定义获取数组长度的函数。

/******************************************************
*  函数功能:插入法排序                               *
*  参数入口:Data为数组,length为数组长度             *
*  返回值:  无返回值                                 *
******************************************************/
void Insertion_sort(int *Data, int length)
{ 
	int insert_data=0;                        
	for(int j=1;j<length;j++)     
	{
		insert_data=Data[j];                    //即将要排序的数。
		int i=j-1;                        
		while(i>=0 && Data[i]>insert_data)      //循环判断这个数在之前数列中的位置。
		{
			Data[i+1]=Data[i];
			i--;
		}
		Data[i+1]=insert_data;                  // 将要排序的数插入到数组中。
	}
}

int main(void)
{
	int Data[10];
	srand((unsigned)time(NULL)); 
	for(int i=0;i<10;i++)                      //随机产生10个随机数
	{
		Data[i]=rand()%100;          
	}
	int len;
	ARRAY_LENGTH(Data,len);                    //获取数组长度。
	Insertion_sort(Data,len);
	for(int i=0;i<len;i++)                     
	{
		printf("%d  ",Data[i]);
	}
	return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值