算法导论 练习题 2.3-6
2017-03-16 16:42
169 查看
#include <stdio.h> int halfSearch(int a[],int p,int r,int key) { int q=(p+r)/2; while(a[q]!=key && a[p]<key && a[r]>key) { q=(p+r)/2; if(a[q]>key) { r=q-1; } else { p=q+1; } } if(a[q]==key) { return q; } if(a[r]<key) { return r; } if(a[p]>key) { return p-1; } } void insertSort(int a[],int len) { int i,j,k,key; for(i=1;i<len;i++) { key=a[i]; j=halfSearch(a,0,i-1,key); for(k=i;k>j;k--) { a[k]=a[k-1]; } a[k+1]=key; } } int main() { int a[]={31,41,59,26,41,58}; insertSort(a,6); for(int i=0;i<6;i++) { printf("%d ",a[i]); } getchar(); }
查找操作可以改进到lgn,但如果使用数组,移动元素操作最坏情况上界仍然为n平方,所以无法改进为nlgn。使用链表可以。
相关文章推荐
- 170916_算法导论学习(四)_2.3 设计算法_练习
- 算法导论2.3-6
- 【算法导论】 2.3合并排序
- 算法导论 2.3-5
- 「算法导论」:课后习题2.3-7求集合S中是否有两个元素的和为X
- 算法导论3.1练习题
- 自做算法导论第一章练习题
- 算法导论3.2练习题
- 算法导论 练习题 4.3-7
- 算法导论2.3-7
- 算法导论 练习题 8.1-3
- 插入排序的递归实现和二分查找递归实现,算法导论2.3-4和2.3-5
- 算法导论2.3-7
- 归并排序 (不采用哨兵) 算法导论2.3-2答案
- 算法导论2.3-5二分法查找问题
- 【算法导论】第三版课后习题*2.3-7
- 算法导论 2.3-3
- 170915_算法导论学习(三)_2.3 设计算法
- 算法导论2.3-5二分查找
- <算法导论>第二章 2.3设计算法