C语言各种排序算法

1、shell排序(希尔排序)

思想:把记录按下标的一定增量分组,对每组使用直接插入算法排序;随着增量逐渐减少,每组包含的关键字越来越多,当增量减少至1时,整个文件恰被分为一组,算法终止。

优点:直接插入排序的改进版。
(1)不需要大量的辅助空间;(2)时间复杂度与增量序列的选取有关,(希尔增量时间复杂度为O(n^2)),希尔排序的时间复杂度下限是O(n(log2n)),对于中等大小规模表现良好;(3)最坏情况和平均情况下执行效率相差不是很大,而快排在最坏情况下执行的效率会非常差。

这里写图片描述

  • 希尔增量排序代码:
   #include <stdio.h>

   void shellsort(int array[], int len)
   {
       int dist; //distance
       int i;
       int j;
       int temp;

      for (dist = len / 2; dist > 0; dist /= 2)
      {
          for (i = dist; i < len; i++)
          {
              for (j = i - dist; (j >= 0) && (array[j] > array[j+dist]); j -= dist)
              {
                  temp = array[j];
                  array[j] = array[j+dist];
                  array[j+dist] = temp;
              }
  //
  //          if (array[i-dist] > array[i])  //(X)要注意:交换后,之前的顺序要保持正确。。。。。
  //          {
  //            temp = array[i-dist];
  //            array[i-dist] = array[i];
  //            array[i] = temp;
            }
          }
      }
  }

  int main()
  {
      int i = 0;
      int array[20] = {13, 5, 4, 1, 2, 9, 14, 11};


      for (; i < 8; i++)
      {
          printf("%d\t", array[i]);
      }
      printf("\n");

      shellsort(array, 8);

      for (i = 0; i < 8; i++)
      {
          printf("%d\t", array[i]);
      }
      printf("\n");

      return 0;
  }


猜你喜欢

转载自blog.csdn.net/zyx_0604/article/details/75196019