改进后的希尔排序,速度快一倍
来源:互联网 发布:数据恢复精灵4 注册码 编辑:程序博客网 时间:2024/05/22 07:00
改进方法参照:http://faculty.simpson.edu/lydia.sinapova/www/cmsc250/LN250_Weiss/L12-ShellSort.htm#increments
/*************************************************************************> File Name: shellsort.cpp> Author:keson > Mail:keson@bupt.edu.cn > Created Time: 2014年11月30日 星期日 10时05分18秒 ************************************************************************/#include<iostream>#include<vector>#include<fstream>#include<string>#include<algorithm>#include<cmath>using namespace std;//一般的希尔排序函数template<typename Comparable>void shellsort(vector<Comparable> &a){ for(int gap=a.size()/2;gap>0;gap/=2) for(int i=gap;i<a.size();++i) { Comparable tmp=std::move(a[i]); int j=i; for(;j>=gap&&tmp<a[j-gap];j-=gap) a[j]=std::move(a[j-gap]); a[j]=std::move(tmp); }}//得到希尔排序的序列号: 1,5,19,41,109.......//可参考http://faculty.simpson.edu/lydia.sinapova/www/cmsc250/LN250_Weiss/L12-ShellSort.htm#incrementstemplate<typename Comparable>vector<int> getseq(const vector<Comparable> &a){ vector<int> vec; int val1=0,val2=0; for(int i=0;val1<a.size()/2&&val2<a.size()/2;i++) { val1=9*(pow(4,i)-pow(2,i))+1; val2=pow(2,i+2)*(pow(2,i+2)-3)+1; vec.push_back(val1); vec.push_back(val2); } sort(vec.begin(),vec.end(),greater<int>()); return vec;}//用得到的序列号进行希尔排序template<typename Comparable>void shellsort1(vector<Comparable> &a){ vector<int> seq=getseq(a); int index=0; for(int gap=seq[index];index<seq.size();gap=seq[++index]) { for(int i=gap;i<a.size();++i) { Comparable tmp=std::move(a[i]); int j=i; for(;j>=gap&&tmp<a[j-gap];j-=gap) a[j]=std::move(a[j-gap]); a[j]=std::move(tmp); } } }int main(){ ofstream out; out.open("NUMBER_FILE"); int SIZE=50000000; while(SIZE) { out<<rand()%10000<<" "; SIZE--; } out.close(); ifstream in; in.open("NUMBER_FILE"); ofstream out2("SORT1"); vector<int>vec; int val; while(in>>val) vec.push_back(val); vector<int> vec1(vec); clock_t start_time=clock(); //原来的希尔排序 shellsort(vec); clock_t end_time=clock(); cout<<"Running time is:"<< static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC<<" S"<<endl; clock_t start_time1=clock(); //改进的希尔排序 shellsort1(vec1); clock_t end_time1=clock(); cout<<"QUICK Running time is "<< static_cast<double>(end_time1-start_time1)/CLOCKS_PER_SEC<<" S"<<endl; //测试两种排序结果是否一样 int flag=0; for(int i=0;i<vec.size();i++) { if(vec[i]!=vec1[i]) flag++; } cout<<flag<<endl; for(auto c:vec) out2<<c<<" "; in.close(); out2.close();}
0 0
- 改进后的希尔排序,速度快一倍
- 改进的希尔排序
- 插入排序的改进2:希尔排序
- 希尔排序(插入排序的改进)C++实现
- 直接插入排序到希尔排序做的那些改进
- 改进排序算法:希尔排序(对直接插入排序的改进)
- 快速排序:改进后的冒泡排序
- 排序算法之希尔排序-优化后的插入排序
- 插入排序高效改进之希尔排序
- 改进后的直接插入排序
- 改进后的快速排序--ImprovedQuickSort
- 希尔排序(shell排序)的详细解说,对插入排序算法的改进
- java关于插入排序—希尔排序的理解,以及冒泡排序的改进
- 算法<改进的冒泡排序、直接插入排序、折半插入排序、希尔排序、快速排序、归并排序>
- 几种常见的排序算法(插入排序,希尔排序,归并排序和快速排序),算法分析以及改进
- 2希尔排序-直接插入排序改进版
- 改进后的冒泡排序(单向起泡)
- 希尔排序的实现
- QP问题的解法(拉格朗日乘子法)
- linux下python自动补全命令
- Android Material Design-Getting Started(入门)-(一)
- PhotoShop算法实现--色彩平衡(偏色校正)(一)
- 使用Timer注意挂起问题
- 改进后的希尔排序,速度快一倍
- Android Material Design-Using the Material Theme(使用Material主题)-(二)
- quartz(一)--概览
- java泛型T.class的获取
- web打印实现几种方法
- IOS-入门示例
- Android Material Design-Creating Lists and Cards(创建列表和卡片)-(三)
- poj 2385 Apple Catching
- getReadableDatabase、getWritableDatabase以及数据库版本升级