是经过相关资料及网上博客的综合关于二分查找以及堆排序和快速排序的代码,觉得不错,总结了以下经过测试的健壮性较强,运行高效的代码,拿来分享下。
(1)二分查找:
/*二分查找*/
//a表示数组,len数组长度,key要查找的值
//找到返回位置,找不到返回-1
int b_search(int a[], int len, int key){
int mid, low, high;
low=0;
high=len-1;
mid=low+(high-low)/2;
while(low<=high){
if(key==a[mid]){
return mid;
}
else if(key>a[mid]){
low=mid+1;
}
else{
high=mid-1;
}
mid=low+(high-low)/2;
}
return -1;
}
//二分查找,返回被查找元素第一次出现的位置
//未查到返回-1
int b_search_fir(int a[], int n, int key){
int mid, l, h, min_index=-1;
l=0;
h=n-1;
mid=l+(h-l)>>1;
while(l<=h){
if(key==a[mid]){
min_index=mid;
h=mid-1;
}
else if(key>a[mid]){
l=mid+1;
}
else{
h=mid-1;
}
mid=l+(h-l)/2;
}
return min_index;
}
//二分查找,返回元素被查找元素最后一次出现的位置
//未查到返回-1
int b_search_lst(int a[], int n, int key){
int mid, l, h, min_index=-1;
l=0;
h=n-1;
mid=l+(h-l)>>1;
while(l<=h){
if(key==a[mid]){
min_index=mid;
l=mid+1;
}
else if(key>a[mid]){
l=mid+1;
}
else{
h=mid-1;
}
mid=l+(h-l)/2;
}
return min_index;
}
交换函数:
inline exchange(int &a, int &b){
int tmp=a;
a=b;
b=tmp;
}
下面是排序代码:
(2)快速排序:
/*快速排序*/
//数组a,排序的数组范围left,right
void g_quicksort(int a[], int left, int right){
if(left>=right)
return;
int i,j,std;
srand(time(0));
std=left+rand()%(right-left+1);//随机产生划分基准点,以免(数据顺序或逆序时)产生坏的划分
cout<<"std:"<<std<<endl;
exchange(a[left], a[std]);//将基准点std放到最左位置
std=a[left];
i=left+1;
j=right;
while(1){
while(a[i]<std && i<right)
i++;
while(a[j]>std && j>left)
j--;
if(i>=j)
break;
exchange(a[i], a[j]);
}
exchange(a[left], a[j]);//将基准记录定位
quicksort(a, left, j-1);
quicksort(a, j+1, right);
}
(3)堆排序:
/*堆元素调整*/
//堆数组a,堆长度len,调整元素位置pos
void g_heap_shift(int a[], int len, int pos){
int i=pos, j=2*i+1;
int tmp=a[i];
while(j<len){
if(j+1<len && a[j]<a[j+1])
j++;
if(a[j]<tmp)
break;
else{
a[i]=a[j];
i=j;
j=2*i+1;
}
}
a[i]=tmp;
}
/*堆排序*/
//堆数组a,堆长度len
void g_heap_sort(int a[], int len){
for(int i=(len-1)/2;i>=0;i--){
g_heap_shift(a,len,i);
}
for(i=len-1;i>=0;i--){
swap(a[i], a[0]);
g_heap_shift(a,i,0);
}
}
好,睡觉了,明天南理工baidu笔试,估计又要从我这里悄悄溜走了,baidu