最近在开始学习算法,算法入门一般是以排序算法为主,而排序呢用的也是比较多,这两天也是接触了几种常见的算法,比如快速排序,直接插入排序,冒泡排序等。那这里先介绍一下直接插入排序吧,呵呵,由于是第一次在CSDN上发表文章,有写的不好的地方还请见谅以及提出意见。
插入排序对少量元素进行排序比较有效,这种排序和我们平时玩扑克牌比较类似,从桌面上的牌堆一次摸一张牌,然后把这张牌插入到我们手上已摸的牌的一个正确的位置上。为了找到这个正确位置,我们需要和已经排好顺序的手牌进行比较,从最右边的一张开始比较,如果摸起来的牌比这个手牌大,那么放在这个手牌的最右边,再继续摸牌即可,否则我们再同这个手牌左边的那种牌继续比较,直到摸起来的牌找到正确的插入位置为止,再继续摸牌。
具体的排序过程如下:现在有1个数组a[]={1,7,2,5,4}需要排序(从小到大)。
数组的长度是5(和数组的下标不同),现在第1个元素肯定是排好顺序的,我们可以把a[]分为2个部分,其中a[]为已经排好顺序的数组,而a'[]为a[]中还没有排序的元素组成的数组。每次从a'[]中取出1个元素插入a[]中,当a'[]为空时,排序完成。
第一次排序时,a[]={1}, a'[]={7,2,5,4} 用变量j来控制a[]中的第2个到最后元素的遍历, for(index=1,index!=5;index++)
那么第一次循环j=1,a[index]=7, 把这个值保存到1个变量key中,我们把他同他的前1个元素进行比较,那么可以定义1个变量j=index-1,即该元素的前1个元素也就是a[0],如果j是大于等于0的(确保数组不会越界)而且a[j]的值比key的大,那么我们互换这2个元素的位置,a[j+1]=a[j](此时a[j]的值被覆盖),然后把j-1,继续同前1个值进行比较,直到前面这2个条件不满足,由于最后做了次j--,那么即使跳出循环了,此时a[j]指向的位置也是往前靠了1个的,我们插入的key值放的位置是在刚才的j--之前的那个元素,所以需要把key赋值给a[j+1],这样完成这次的排序。
具体的代码,如下:
void InsertSort(int a[],int lenth)
{
for (int index=1;index!=lenth;++index)
{
int key=a[index];
int j=index-1;
while(j>=0&&a[j]>key)
{
a[j+1]=a[j];
j--;
}
a[j+1]=key;
}
}
进行测试:
void main()
{
int a[]={12,3,4,11,65,3,4,33};
InsertSort(a,8);
for(int index=0;index!=8;++index)
{
cout <<a[index] <<endl;
}
}
运行结果如图: