插入排序和希尔排序

来源:互联网 发布: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]);
 }
}

原创粉丝点击