想到什么写什么。。。

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.字典树及后缀树         (核心思想就是用空间换时间)!

 

 

 

posted @ 2013-01-25 11:28  曙光_用代码记录人生  阅读(131)  评论(0编辑  收藏  举报