插入排序

来源:互联网 发布:关晓彤微博照片软件 编辑:程序博客网 时间:2024/06/02 03:01

写了几十年的程序,大多数都是有关逻辑与事务方面的,涉及算法的比较少,因此算法方面感到很生疏了。如果继续写逻辑事务型程序,可能自己随时会厌倦的,并且能力也难再提高。所以决定再学一次算法,以后尽量写一些更加关键的代码,尽量减少简单代码的重复编写。

《算法导论》是一本不错的书,涉及的算法比较全面。这两天学习了插入排序算法。

插入排序算法的实质用形式化的语言描述就是:

将数组的第N+1个A[N]元素插入到A[0]到A[N-1]之间,其中A[0]到A[N]已经是有序的。

从1到M(M为数组的长度)重复以上插入过程,就可以完成整个数组的插入排序。

其中最关键的问题是找到插入位置,同时插入位置右边的所有元素被整体移动。

算法C++代码如下:

void insertion_sort(int arrayData[], int arrayLength)

{

int data;

for(int i = 1; i < arraryLength; i++) //第一个元素已经排好序,所以从第二个元素开始插入

{

data = arrayData[i]; //待插入的元素

int j = i - 1; //第i+1个元素之前的所有元素已经排好序

//查找插入位置,升序排列;

while((data < arrayData[j]) && ( j >= 0))

//如果是降序排列,

//while((data < arrayData[j]) && ( j >= 0))

{

arrayData[j+1] = arrayData[j]; //将第j+1个元素向后移动

j--;

}

arrayData[j+1] = data; //将第i+1个元素插入到第j+1个元素之后。

}

}

 

测试代码:

int testArrayData[] = {5, 2, 4, 6, 1, 3, 10, 9, 8, 12, 7, 15, 100, 234, 45, 67, 322, 444, 123, 3567,1256,1234567,2176};
int _tmain(int argc, _TCHAR* argv[])
{

     int arrayLength = sizeof(testArrayData)/sizeof(int);
     insertion_sort(testArrayData, arrayLength);
 

    for(int i = 0; i < arrayLength ; i++)
        printf("%d ",
testArrayData[i]);
    printf("/n");


    return 0;
}

 

测试升序结果:

1 2 3 4 5 6 7 8 9 10 12 15 45 67 100 123 234 322 444 1256 2176 3567 1234567

测试降序结果:

1234567 3567 2176 1256 444 322 234 123 100 67 45 15 12 10 9 8 7 6 5 4 3 2 1


原创粉丝点击