插入排序和希尔排序
来源:互联网 发布:mac android sdk 编辑:程序博客网 时间:2024/05/21 17:03
插入排序和希尔排序本质上是相同的。
插入排序的关键思想是,选定一个元素的值保存在临时变量里面,把前面的元素依次和临时变量里的值比较,如果比它大就依次后移(这里是升序),再把临时变量里的值插入到最前面空出的位置。一次迭代以后,选定元素位置前面的所有元素都处于已排序状态。下面的代码是用数组实现插入排序,用单链表实现插入排序的代码见http://blog.csdn.net/huhao_bupt/archive/2009/08/12/4438004.aspx
希尔排序利用了这个性质,使用递减步进值插入排序。步进值逐步变小,每次迭代后,都更接近排好序,这样可以减少下次移动元素的次数。当步进值为1时,完成最后一次迭代。希尔排序的关键是选一组好的步进值。这里并没有仔细选择,而使用了效率并不高的步进值。实际使用时要仔细选择。
一个原则是,尽量使用希尔排序,如果程序效率明显不高,那么再改用快速排序。如果已经基本排好序,那么插入排序是比较好的选择。
#include <stdio.h>
/*希尔排序例程*/
void shellsort(int a[],int n)
{
int i,j,h;
for(h=n/2;h>0;h=h/2)/*h是步进值,每次迭代逐步缩小,直到1*/
{
for(i=h;i<n;i++)/*步进为h的插入排序*/
{
int temp = a[i];
for(j=i;(j>=h)&&(temp<a[j-h]);j=j-h)
{
a[j]=a[j-h];
}
a[j] = temp;
}
}
}
/*插入排序例程*/
void insertsort(int a[],int n)
{
int i ,j ;
for(i=1;i<n;i++)
{
int temp = a[i];
for(j=i;(j>=1)&&(temp<a[j-1]);j--)
{
a[j]=a[j-1];
}
a[j] = temp;
}
}
/*希尔排序测试例程*/
void main()
{
int i = 0;
int a[] = {1,2,34,23,12,9,0,5,6,88,73,45,66,77,8,11,7};
int n = sizeof a/sizeof a[0];
shellsort(a,n);
for(;i<n;i++)
{
printf("%d ",a[i]);
}
}
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 希尔排序和插入排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 插入排序和希尔排序
- 在Flex和LiveCycle中使用文档对象
- .NET : 在单元测试中使用外部文件作为数据源
- 正则表达式学习(二)之常见正则表达式汇总
- 数据库学习之CREATE DATABASE
- COM组件设计与应用(三)
- 插入排序和希尔排序
- java实现数据连接池
- 关于测试计划的指定
- AJAX技术简介及入门实例
- Ubuntu/Debian 之内核模块开发准备
- 孰能浊以止,静之徐清
- 最新apache2.2.11 + tomcat6.0.20 整合
- OTP
- 迷茫中