• 排序_希尔排序


     1 void shellSort(LineList R[], int n)
     2 {
     3     int i, j, d;
     4     d = n / 2;
     5 
     6     while (d > 0)
     7     {
     8         for (i = d + 1; i <= n; i++)
     9         {
    10             if (R[i].key < R[i - d].key)
    11             {
    12                 R[0].key = R[i].key;
    13                 for (j = i - d; j > 0 && R[0].key < R[j].key; j = j - d)
    14                 {
    15                     R[j + d] = R[j];
    16                 }
    17                 R[j + d] = R[0];
    18             }
    19         }
    20         d = d / 2;
    21     }
    22 }

    下标从0开始的算法如下:

     1 void insertSort(ElementType A[], int N)
     2 {
     3     int p, i;
     4     ElementType tmp;
     5 
     6     /* 希尔增量序列 */
     7     for (D = N / 2; D > 0; D /= 2)
     8     {
     9         /* 插入排序 */
    10         for (p = D; p < N; p++)
    11         {
    12             tmp = A[p];
    13             for (i = p; i >= D && A[i - D] > tmp; i -= D)
    14             {
    15                 A[i] = A[i - D];
    16             }
    17 
    18             A[i] = tmp;
    19         }
    20     }
    21 }

    另外还有sedgewick序列的方法

     1 void ShellSort( ElementType A[], int N )
     2 { 
     3      /* 希尔排序 - 用Sedgewick增量序列 */
     4      int Si, D, p, i;
     5      ElementType tmp;
     6 
     7      /* 这里只列出一小部分增量 */
     8      int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0};
     9       
    10      for ( Si = 0; Sedgewick[Si] >= N; Si++ ) 
    11          ; /* 初始的增量Sedgewick[Si]不能超过待排序列长度 */
    12  
    13      for ( D = Sedgewick[Si]; D > 0; D = Sedgewick[++Si] )
    14     {
    15         /* 插入排序*/
    16          for ( p = D; p < N; p++ ) 
    17         { 
    18              tmp = A[P];
    19              for ( i = p; i >= D && A[i - D] > tmp;  i -= D )
    20             {
    21                  A[i] = A[i-D];
    22             }
    23              A[i] = tmp;
    24          }
    25     }
    26 }            
  • 相关阅读:
    set
    网络流学习(最小费用最大流)
    网络流学习(最大流)
    模拟退火学习
    NOI Day1T1归程(Kruskal重构树+Dijkstra)
    线性基学习
    高斯消元学习
    manacher算法学习(求最长回文子串长度)
    AC自动机模板2
    AC自动机入门
  • 原文地址:https://www.cnblogs.com/abc-begin/p/7641626.html
Copyright © 2020-2023  润新知