1.90%人不能正确写出的二分查找
1 int binarySearch(int a[],int n,int key) 2 { 3 int left=0; 4 int right=n-1; 5 while(left<=right)//易错点:一定要是小于等于 6 { 7 int mid=left+((right-left)>>1);//1。防止溢出,当l,r很大时,(l+r)>>1可能溢出,2.位运算加快速度 3.一定要加括号,>>优先级小于+ 艹,你妹啊 8 if(a[mid]>key) 9 right=mid-1; 10 else if(a[mid]<key) 11 left=mid+1; 12 else //相等的情况必然小,放在后面,不用每次 先比较是否相当。。。 13 return mid; 14 } 15 return -1; 16 }
2.O(n)效率排序
(1)。重新排列使负数在正前面 重新排列使负数在正前面(类似这种的,粗略排序)
1 void sort(int a[],int n) 2 { 3 int l=0; 4 int r=n-1; 5 while(l<r) 6 { 7 while(r>l&&a[l]<0) l++; 8 while(r>l&&a[r]>0) r--; 9 swap(a[l],a[r]); 10 } 11 }
(2)。全部数据都在一定范围内的排序,可以达到O(n);
比如:排序0---999之间的数,拿5000000个数据实验:(快排的时间是80ms,而hash的方法是5ms)
int f(int a[],int n) { int h[1000]={0}; for(int i=0;i<n;i++) h[a[i]]++; int t=0; for(int i=0;i<1000;i++)//重排 while((h[i]--)!=0) a[t++]=i; }
3.字符串的问题,常用的几种方法:1。hash_table 2。素数方法 3。KMP 4.字典树及后缀树 (核心思想就是用空间换时间)!