入门算法
查询算法
1、遍历
O(n)
通常遍历都是O(n)
2、折半查找(二分查找)
O(log2 n)
前提有序,并且数据可比较
每次于中间值进行比较,缩小数据可能范围(每次缩小为之前的一半)
百万级数据在20次左右完成
二叉查找树,根节点严格大于左子树,小于右子树
//递归折半查找
bool search(int *arr,int left,int high,int val)
{
if(left > high)
return false;
int mid = (left+high) / 2;
if(val == arr[mid])
return true;
if(val > arr[mid])
return search(arr,mid + 1,high,val);
if(val < arr[mid])
return search(arr,left,mid - 1,val);
}
//循环折半查找
bool search(int *arr,int size,int val)
{
int left = 0;
int right = size -1;
int mid =(left + right)/ 2;
while(left >= right)
{
if(arr[mid] > val)
right = mid - 1;
if(arr[mid] < val)
left = mid + 1;
if(arr[mid] == val)
return true;
mid = (left + right) / 2;
}
return false;
}
3、索引查找
索引存储
先将数据按照区间划分成索引,区间之间有序
根据所以查找到数据所在区间,在进行查找
4、哈希查找
首先构建哈希表,存放数据的空间
数据 由两部分构成 key val
哈希表 f(key)(下标)和地址(元素值)构成
通过函数f(),将key转换成哈希表中的某一个值
排序算法
1、冒泡排序
void sort(int *arr,int size)
int i ,j;
for(i = 0; i < size - 1; i++)
{
for(j = 0; j < size - i -1; j++)
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
2、快速排序
基本思路
- 1.先从数列中取出一个数作为基准数。
- 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 3.再对左右区间重复第二步,直到各区间只有一个数。
void sort(int *arr,int left,int right)
{
if(left >= right)
return ;
int i = left;
int j = high;
int key = left;
while(i < j)
{
while(i < j && arr[j] >= arr[key])
j--;
while(i < j && arr[i] <= arr[key])
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int temp = arr[i];
arr[i] = arr[key];
arr[key] = temp;
sort(arr,low,i - 1);
sort(arr,i + 1, high);
}
3、插入排序
void sort(linklist_p h)//插入排序
{
if(h == NULL || h->next == NULL)
return ;
linklist_p p = h->next->next;
h->next->next = NULL;
while(p != NULL)
{
//取得无序链表的第一个节点
linklist_p r = p;
p = p->next;
//遍历有序链表, 找到结点r的位置
//q->data <= r->data && q->next->data >= r->data
//q->data <= r->data && q->next == NULL
//-> q->data <= r->data && ([q->next == NULL || q->next->data >= r->data)
linklist_p q = h;
while(q->next && q->next->data < r->data)
{
q = q->next;
}
//将结点r插入到q的后面
r->next = q->next;
q->next = r;
}
}