二分查找:

int binsearch(int x,int s[],int n){
    int i,j,middle,left,right;
    // middle=n/2;
    right=n-1;
    while(left<=right){
        middle=(right+left)/2;
        if(x>s[middle])
            left=middle+1;
        else if(x<s[middle])
            right=middle-1;
        else
            return middle;
    }
    return -1;
}

希尔排序:

void shellsort(int *s,int n){
    int i,j,gap=n/2,temp;
    while(gap>0){
        gap/=2;
        for(i=gap;i<n;i++)
            for(j=i-gap;s[j]>s[j+gap]&&j>=0;j-=gap)
                temp=s[j],s[j]=s[j+gap],s[j+gap]=temp;
    }
}

 归并排序:

void merge(int *a,int *t,int leftend,int middle,int rightend){
    int leftop=leftend,rightop=middle,i=leftend;
    while(leftop<middle&&rightop<=rightend){
        if(a[leftop]<=a[rightop])
            t[i++]=a[leftop++];
        else 
            t[i++]=a[rightop++];
    }
    while(leftop<middle){
        t[i++]=a[leftop++];
    }
    while(rightop<=rightend){
        t[i++]=a[rightop++];
    }
    for(i=rightend;i>=leftend;i--){
        a[i]=t[i];
    }
}
void msort(int *a,int *t,int leftend,int rightend){
    if (leftend==rightend)
    {
        return;
    }
    int middle;
    middle=(rightend+leftend)/2;
    msort(a,t,leftend,middle);
    msort(a,t,middle+1,rightend);
    merge(a,t,leftend,middle+1,rightend);
}

 堆排序:

void sift(int *s,int low,int high){
    int i=low;
    int j=2*i+1;
    int tmp=s[i];
    while(j<=high){
        // 判断j在二叉树的里面
        if(j+1<=high && s[j+1]>s[j]){
        // 找到最大的二叉树子节点
            j=j+1;
        }
        if(tmp<s[j]){
        // 比较父节点和最大子节点的大小,如果父节点小则下移,如果不小则停止循环
            s[i]=s[j];
            i=j;
            j=2*i+1;
        }
        else{
            break;
        }
    }
    s[i]=tmp;
    // 把之前堆顶的值放到对应位置
}

void heap_sort(int *s,int n){
    int i,j,tmp;
    for(i=(n/2-1);i>=0;i--){
    // 从最小的有儿子的节点开始,记住最右面的子节点是s[n-1],n/2-1这个就是最小的有儿子节点的数
        sift(s,i,n-1);
    }
    for(i=n-1;i>0;i--){
        tmp=s[0],s[0]=s[i],s[i]=tmp;
        sift(s,0,i-1);
    // 一步步的出堆,然后把最大值放到最后面
    }
}