算法笔记

学习一些入门算法应该不会很难吧,哈哈(C++)

快排

假设q[n]是一个整数数组需要排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void quicksort(int q[],int l,int r)
{
if (l >= r) return;
int mid = q[l];
int i = l - 1, j = r + 1;
while (l < r)
{
do { i++; }
while (q[i] < mid);
do { j++; }
while (q[j] > mid);
if (i < j) swap(q[i], q[j]);
}
​ quicksort(q, l, j); //这时不能用i-1,因为最后不一定就是i>j也可能是i=j,就可能i-1会比l小
​ quicksort(q, j + 1, r); //
}

归并

​ 分两步:递归和合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void merge(int q[], int l, int r)
{
if (l >= r)
return;
int mid = l + r >> 1;
merge(q, l, mid);//一开始就要递归
merge(q, mid + 1, r);
for (int i = l; i <= r; i++)//把q数组l到r的内容复制到p
p[i] = q[i];
int i = l, j = mid + 1, x = l;
while (i <= mid && j <= r)//进行合并,循环条件是两部分没有到端点
{
if (p[i] < p[j])//把的那个放入q中
q[x++] = p[i++];
else
q[x++] = p[j++];
}
if (i <= mid)//如果一方没到终点则直接放到q后面
{
while (i <= mid)
q[x++] = p[i++];
}
else
while (j <= r)
q[x++] = p[j++];
}

整数二分

1.从左往右逼近

解释:1 2 2 2 2 2 3,在这里面找2的话,二分肯定要取1到2,或者是2到3这个区间,但是不可能找到2到2这个区间,所以会失去一些数

1
2
3
4
5
6
7
8
9
10
11
12
13
int half(int q[], int l, int r, int x)
{ //找x
int mid = l + r >> 1;
while (l < r)
{
mid = l + r + 1 >> 1;
if (q[mid] <= x)
l = mid;
else
r = mid - 1;
}
cout << r;
}

2.从右往左逼近

1
2
3
4
5
6
7
8
9
10
11
12
13
int half(int q[], int l, int r, int x)
{ //找x
int mid ;
while (l < r)
{
mid = l + r >> 1;
if (q[mid] >=x)
r = mid;
else
l = mid+1;
}
cout << l;
}
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2021 饶瑞军
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信