排序算法之希尔排序的C++实现

来源:互联网 发布:910九玩诛仙手游端口 编辑:程序博客网 时间:2024/06/05 00:31

希尔排序其实是直接插入排序的一种优化,不过是增加了一个步长进行分组插入罢了,又称为缩小增量排序。其基本思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待gap=1时,再对全体元素进行一次直接插入排序,数组便是有序的了。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比直接插入有较大提高。

按定义直接实现:

void shellsort1(int a[], int n)  {      int i, j, gap;        for (gap = n / 2; gap > 0; gap /= 2) //步长          for (i = 0; i < gap; i++)        //直接插入排序          {              for (j = i + gap; j < n; j += gap)                   if (a[j] < a[j - gap])                  {                      int temp = a[j];                      int k = j - gap;                      while (k >= 0 && a[k] > temp)                      {                          a[k + gap] = a[k];                          k -= gap;                      }                      a[k + gap] = temp;                  }          }  }  
很明显,上面的shellsort1代码虽然对直观的理解希尔排序有帮助,但代码量太大了,不够简洁清晰。因此进行下改进和优化,以第二次排序为例,原来是每次从第一个元素开始和后面的进行比较,现在可以改成从第gap个元素开始,与前面的元素比较后再和后面的比较。这种每次从数组第gap个元素开始,每个元素与自己组内的数据进行直接插入排序显然也是正确的。

void shellsort2(int a[], int n)  {      int j, gap;            for (gap = n / 2; gap > 0; gap /= 2)          for (j = gap; j < n; j++)//从数组第gap个元素开始              if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序              {                  int temp = a[j];                  int k = j - gap;                  while (k >= 0 && a[k] > temp)                  {                      a[k + gap] = a[k];                      k -= gap;                  }                  a[k + gap] = temp;              }  }  

很明显,改进算法减少了一层for循环,效率得到了提高。


原创粉丝点击