C语言中常用的排序和查找的方法就是冒泡排序和二分查找,接下来来简单看一看:
冒泡排序:
冒泡排序适用于所需要的排列的元素较少的时候,因为需要一次次去遍历。每次遍历令最大的一个数到全部元素的最后一个去。
直接放一个冒泡排序的函数:
void bubblesort(int n, int a[]) {//n为元素个数,a[]为储存排列对象的数组
int i, j;
int temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
二分查找:
二分查找很像初高中学习的二分法,前提当然是先要让查找的范围是单调的才行。简单来说就是通过令查找范围中中间的的元素和查找对象进行比较来缩小进一步查找的区间。
先来放一个基础的:
// 返回第一个不小于val的值的下标
//a为非降序数组,n为数组长度,key为要查找的值
int lower_bound(int a[], int n, int key) {
int mid;
int l = 0, r = n;
while (l < r) {
mid = (l + r) >> 1;
if (key <= a[mid])
r = mid;
else
l = mid + 1;
}
return l;
}
上面的代码不仅仅可以找到所需查找的值,而且输出的还是最小的下标。
二分查找还有很多变式,如输出第一个比查找目标大的值:
int upper_bound(int a[], int n, int val) {
int mid;
int l = 0, r = n;
while (l < r) {
mid = (l + r) >> 1;
if (val >= a[mid])
l = mid + 1;
else
r = mid;
}
return l;
}
或者还有给定复杂的单调函数,给y求x的题目。