SHELL排序

 1 template <class Item>
 2 void shellsort(Item a[], int l, int r)
 3   {  int h;
 4       for (h = l; h <= (r-l)/9; h = 3*h+1) ;
 5       for ( ; h > 0; h /= 3)
 6          for (int i = l+h; i <= r; i++)
 7             { int j = i; Item v = a[i];
 8                whlie (j >= l+h && v < a[j-h])
 9                    { a[j] = a[j-h]; j -= h; }
10                a[j] = v;
11             }
12   }

  插入排序运行效率较低的原因是它所执行的交换操作涉及邻近的数据项,使得数据项每次只能移动一位。例如,如果键最小的数据项刚好在数组的尾端,就需要N步来将该项放到数组的最前端。shell排序法是插入排序的扩展,它通过允许非相邻的数据项进行交换来提高效率。

  该算法将文件重新安排,使文件具有这样的特性,每第h个文件(从任何地方开始)组成一个排好序的文件。另一种说法就是,已h-排序的文件是h个独立的已排好序的文件,相互交叉在一起。对h值较大的h-排序文件,可以通过移动相距较远的元素使文件比较容易地进行h值较小的h-排序。通过按照任意以1结束的步长序列进行操作,就产生了一个排好序的文件:这就是shell排序法的本质。

  性质:对既已h-排序又k-排序的文件进行g-排序时所执行的比较操作数小于N(h-1)(k-1)/g,假设h和k是互质的。

  由于即使对大文件,shell排序法都具有较高的运行效率以及代码简单容易执行,很多排序应用程序都选用了shell排序法。如果你需要快速的解决一个排序问题,而且不会涉及系统排序,你可以使用shell排序法,然后迟点时间再考虑是否需要用一个更完备的算法代替它。

posted @ 2019-11-10 16:46  ~宁静致远~  阅读(776)  评论(0编辑  收藏  举报