shell排序及两种优化

前端之家收集整理的这篇文章主要介绍了shell排序及两种优化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

博客白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇

  1. //最佳步长:https://zh.wikipedia.org/wiki/希尔排序
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. void shellsort(vector<int> &vi){
  8. if(vi.size()<=1) return ;
  9. int n=vi.size();
  10. for(int step=n/2;step>0;step/=2){
  11. for(int i=0;i<step;++i){//1
  12. for(int j=i+step;j<n;j+=step){//2
  13. //在当前层做插入排序,相当于直接插入排序的第一种优化。见直接插入排序。
  14. if(vi[j]<vi[j-step]){//如果前一元素大于当前的元素
  15. int temp=vi[j];
  16. int k=j-step;
  17. while(k>=0 && vi[k]>temp){
  18. vi[k+step]=vi[k];
  19. k=k-step;
  20. }
  21. vi[k+step]=temp;
  22. }
  23. }
  24. }
  25. }
  26. }
  27. //优化1:结构上的优化,shellsort中1与2处的for可以合并一下。
  28. void shellsort1(vector<int> &vi){
  29. if(vi.size()<=1) return ;
  30. int n=vi.size();
  31. for(int step=n/2;step>0;step/=2){
  32. for(int j=step;j<n;++j){
  33. if(vi[j]<vi[j-step]){
  34. int temp=vi[j];
  35. int k=j-step;
  36. while(k>=0 && vi[k]>temp){
  37. vi[k+step]=vi[k];
  38. k=k-step;
  39. }
  40. vi[k+step]=temp;
  41. }
  42. }
  43. }
  44. }
  45. //优化2:结构上的优化,用swap来使代码更精简,但是效率会变低一点
  46. void shellsort2(vector<int> &vi){
  47. if(vi.size()<=1) return ;
  48. int n=vi.size();
  49. for(int step=n/2;step>0;step/=2)
  50. for(int j=step;j<n;++j)
  51. for(int k=j-step;k>=0 && vi[k]>vi[k+step];k-=step)
  52. swap(vi[k],vi[k+step]);
  53. }
  54.  
  55. int main(){
  56. vector<int> vi;
  57. vi={1,8,2,3,7,6,9,5,4};
  58. // shellsort(vi);
  59. // shellsort1(vi);
  60. shellsort2(vi);
  61. for(auto ieh: vi)
  62. cout<<ieh<<" ";
  63. cout<<endl;
  64. return 0;
  65. }

猜你在找的Bash相关文章