二分查找:
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); // 一步步的出堆,然后把最大值放到最后面 } }