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