快速排序:
【性质】该算法是不稳定的(时间复杂度不稳定)
寻找一个基准数,并且按照这个基准数来对区间内的数进行排序。
void quick_sort(int array[],int l,int r){
if(l>=r) return;//区间没有数或者只有一个数
int x=array[l],m=l-1,n=r+1;
while(m < n){
do m++;while(array[m]<x);
do n--;while(array[n]>x);
if(m<n){
int i=array[m];
array[m]=array[n];
array[n]=i;
}
}
quick_sort(array,l,n);
quick_sort(array,n+1,r);
}
【例子】array[8]={49,38,65,97,76,13,27,49}
归并排序:
【性质】该算法是稳定的,即相等的项彼此的相对位置是不会发生改变
【方法】①确定分界点:mid=(l+r)/2
②递归排序left,right
③归并--合二为一
void merge_sort(int *array,int l,int r){
if(l>=r) return;
int mid=l+r>>1;//>>1 为二进制右移运算符
merge_sort(array,l,mid);
merge_sort(array,mid+1,r);
int x=0,m=l,n=mid+1;
while(m<=mid && n<= r){
if(array[m] <= array[n]){
tmp[x++] = array[m++];
}else{
tmp[x++] = array[n++];
}
}
while(m <= mid) tmp[x++]=array[m++];
while(n <= r) tmp[x++]=array[n++];
for(m=l,n=0;m<=r;m++,n++) array[m]=tmp[n];
}
【图解】
二分查找:
当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
int bsearch_1(int l, int r){
while (l < r){
int mid = l + r >> 1;
if (check(mid)){
r = mid;
}else{
l = mid + 1;
}
}
return l;
}
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。
int bsearch_2(int l, int r){
while (l < r){
int mid = l + r + 1 >> 1;
if (check(mid)){
l = mid;
}else{
r = mid - 1;
}
}
return l;
}
高精度算法:
【方法】数字以string的方式读入,将数字按位倒叙存入数组,按照手算进位即可。