二路插入排序的思考与代码实现
来源:互联网 发布:云计算与智慧城市 编辑:程序博客网 时间:2024/06/08 18:09
二路插入排序,如果第一个作为比较划分为两个部分的那个关键字选得好的话,那么移动的次数就会减少很多,比较的次数也会减少很多,但是需要有n个空间辅助,忽然想起本科的数据结构老师说要么用时间换空间,要么用空间换时间,后来又听说现在计算机内存都够用的,感觉又跑偏了……,没办法受酱油师兄的影响实有点大,话语间总有他的风格。 写这个程序的时候,有几点需要注意: 1.final指针和first指针不一样,final指针指向具体的那个数字,而first指针指向具体数字前面的地址
所以在写代码的时候就要注意了final指针是先改变指针再赋值,而first指针要先赋值在改变指针,
2.final指针是从小地址到大地址,而first指针是从大地址到小地址。所以这点是没有一次性作对的原因。
void TwoInsertSort(sqList L,int len){ //利用有哨兵的那种情况进行的 if(len<=1) return; int N=L.length; int d[9]; int *first=&d[8]; int *final=&d[1]; d[1]=L.r[1]; for(int i=2;i<=len;i++) { if(L.r[i]<d[1]) { if(first==&d[8])//不知道这里可不可以一次表达 { *first=L.r[i]; //--first; } else { if(*(first+1)>=L.r[i]) { *first=L.r[i]; //--first; }//if else { int *p; for(p=first+1;*p<L.r[i];p++) *(p-1)=*p; *(p-1)=L.r[i]; //--first; }//else }//else --first; }//if else { if(*final<=L.r[i]) { ++final; *final=L.r[i]; } else { int *p; for(p=final;*p>L.r[i];--p) *(p+1)=*p; *(p+1)=L.r[i]; ++final; } } } int i=1; while(first<&d[8]) { L.r[i]=*(first+1); ++first; ++i; } int j=1; while(final>=&d[j]) { L.r[i]=d[j]; ++j; ++i; } cout<<"自己写的二路插入排序,没有改变存储结构"<<endl; for(int i=1;i<=len;i++) cout<<L.r[i]<<" "; cout<<endl;}
感觉自己写的代码有点冗长,很混乱,目前没有上网查,一定有简单的减少代码量的方法只是我还没有想到。感觉这个方法不是特别好,很多地方仍然用到了直接排序的思想。时间复杂度依旧是o(n2).
0 0
- 二路插入排序的思考与代码实现
- 直接插入排序思考与代码实现
- 折半插入排序的代码实现与思考
- 堆排序的代码实现与思考
- 归并排序的代码实现与思考
- 【数据结构与算法】【排序】直接插入排序的代码实现
- 关于java实现插入排序的思考
- 插入排序算法的实现和思考
- 简单选择排序的代码实现与思考
- 插入排序的代码实现
- 插入排序的基本思想与实现代码
- 排序法系列之二----插入排序(直接插入,希尔排序,二分插入,链表插入排序)的C++代码实现
- 插入排序伪代码与编程实现
- 插入排序代码实现
- 快速排序递归与非递归代码实现与思考
- 插入排序的java实现代码
- 直接插入排序的C++实现代码
- 插入排序的C代码实现
- iOS Core Animation 简明系列教程
- [转]iOS开发系列--通知与消息机制
- C# 动态显示曲线
- 数组------寻找和为定值的两个数
- 实现fresco的DraweeView的图片手势缩放
- 二路插入排序的思考与代码实现
- 面试专题-----操作系统常考(一)
- Xcode插件安装
- linux之x86裁剪移植---字符界面sdl开发入门
- hls流媒体:ts流格式介绍
- mysql 索引
- [版本V2.0]当使用【横向菜单】样式的时候,点击菜单项没有反应问题
- Xcode 不能真机运行了
- Angularjs之ngModel中的值验证绑定