您的位置:首页 > 编程语言

插入排序(直接插入排序法)原理及代码

2014-11-11 18:56 162 查看
上次给大家分享了下冒泡排序算法,这次在这里继续和大家分享下插入排序算法。。

对于插入排序算法通俗的说就是,将一排数据中第二个插到第一个中后有序,第三个插到前两个中后有序.......一次类推。

用另外一种表达就是:插入排序就是每一步都将一个待排序的数据按着其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。

例如:一排数据时4、3、1、2 下面将给大家演示下是如何进行插入排序的,分为三步:



编程思路:

对于给出的一排数据,先将第一个数据当做有序的(毕竟一个么,其实也没有这个有序无序说法),将第二个数据跟有序数据中的最后一个比较,如果比有序数据中的最后一个小则将有序数据中的最后一个数据往后移动,继续和有序数据中的倒数第二个比较,如果比倒数第二个小则将有序数据中的倒数第二个数据往后移动一个位置........直到和有序数据的第一个比较,如果第一个小,则将其往后移动一个位置,将插入的数据插到第一个位置。如果在比较的过程中发现比有序数据中的那个数据大,则就放到上一个往后移动的数据的位置。如果开始跟最后一个有序数据比较就大,那么直接不用动位置,继续下一个插入排序...

具体思路讲的不是特别清晰,如果大家有不明白的地方可以及时的提问....

第一种代码:

void InsertSort(int *array,int n)

{

int i,j ,temp;

for(i=1;i<n;i++)

{

temp=*(array+i);

//如果有序数据中的数据大于需要插入的数据temp则需要将往后移动

for(j=i;j>0 && *(array+j-1)>temp;j--)

{

*(array+j)=*(array+j-1);

}

*(array+j)=temp;//如果小于temp或者所有元素都大于temp或者temp开始就和最后一个有序元素相等

}

}

代码二:

first是数组的一个元素的下标,也就是0,last是最后一个元素的下标也就是元素数目的个数减1;

woid insert_sort(int array[],int first,int last)

{

int i,j;

int temp;

for(i=first+1;i<=last;i++)

{

temp=array[i];

j=i-1;

while((j>=0)&&(array[j]>temp))

{

array[j+1]=array[j];

j--;

}

//如果存在有大于temp的数

if(j!=i-1)

{

array[j+1]=temp;

}

//如果一开始就temp大于最后一个有序数据的话就进入下次循环

}

}

对于以上的两种代码,第一种比较好,希望大家把第一种弄明白,并且熟练掌握。如有不正当的地方希望大家给予指导...

我还会在接下来的文章中继续分享排序的算法原理及代码....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: