插入排序
来源:互联网 发布:关晓彤微博照片软件 编辑:程序博客网 时间: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
- 插入排序-【插入排序】
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 插入排序
- 用mschart 终于实现了鼠标事件,显示X轴和Y轴数据
- 什么是J2EE、Java SE、Java EE、Java ME?
- WTL绘制自定义控件
- 手机编码支持情况
- 用vim转换M$文本中的换行符^M
- 插入排序
- linux下程序设计-IP获取与设置
- 如何查看ubuntu 版本信息
- 面试兵法--沟通
- /*在DataTable中更新、删除数据*/
- Mysql导入导出数据(结构)
- 正确的开场白:从吸引听众开始
- 关于骨骼动画及微软示例Skinned Mesh的解析
- Linux版进程创建