常用算法模板
一、排序
1.快排
void quick_sort(int q
[], int l
, int r
)
{
if(l
>=r
) return;
int i
= l
-1, j
=r
+1, x
=q
[l
+r
>>1];
while(i
<j
)
{
do i
++; while(q
[i
]<x
);
do j
--; while(q
[j
]>x
);
if(i
<j
) swap(q
[i
], q
[j
]);
}
quick_sort(q
, l
, j
), quick_sort(q
, j
+1, r
);
}
补充:快速选择算法(用于快速查找数组中第k大(小)的元素)
int quick_select(vector
<int>& q
, int l
, int r
, int k
)
{
if(l
>=r
) return q
[l
];
int x
=q
[(l
+r
)>>1], i
=l
-1, j
=r
+1;
while(i
<j
)
{
do i
++; while(q
[i
]>x
);
do j
--; while(q
[j
]<x
);
if(i
<j
) swap(q
[i
], q
[j
]);
}
if(j
-l
+1>=k
) return quick_select(q
, l
, j
, k
);
else return quick_select(q
, j
+1, r
, k
-(j
-l
+1));
}
int findKthLargest(vector
<int>& nums
, int k
) {
return quick_select(nums
, 0, nums
.size()-1, k
);
}
2.标准库中的排序
sort方法包含头文件, sort(first_pointer, first_pointer+n, cmp)。
1).定义比较函数
int A
[100];
bool cmp1(int a
,int b
)
{
return a
>b
;
}
sort(A
,A
+100,cmp1
);
2).更懒的方法
functional提供了一堆基于模板的比较函数对象,它们是:equal_to、not_equal_to、greater、greater_equal、less、less_equal。
sort(A
,A
+100,greater
<int>());
sort(A
,A
+100,less
<int>());
二、二分查找
1.整数二分
int binary_search(int[] nums
, int target
) {
int left
= 0, right
= nums
.length
- 1;
while(left
<= right
) {
int mid
= left
+ (right
- left
) / 2;
if (nums
[mid
] < target
) {
left
= mid
+ 1;
} else if (nums
[mid
] > target
) {
right
= mid
- 1;
} else if(nums
[mid
] == target
) {
return mid
;
}
}
return -1;
}
int left_bound(int[] nums
, int target
) {
int left
= 0, right
= nums
.length
- 1;
while (left
<= right
) {
int mid
= left
+ (right
- left
) / 2;
if (nums
[mid
] < target
) {
left
= mid
+ 1;
} else if (nums
[mid
] > target
) {
right
= mid
- 1;
} else if (nums
[mid
] == target
) {
right
= mid
- 1;
}
}
if (left
>= nums
.length
|| nums
[left
] != target
)
return -1;
return left
;
}
int right_bound(int[] nums
, int target
) {
int left
= 0, right
= nums
.length
- 1;
while (left
<= right
) {
int mid
= left
+ (right
- left
) / 2;
if (nums
[mid
] < target
) {
left
= mid
+ 1;
} else if (nums
[mid
] > target
) {
right
= mid
- 1;
} else if (nums
[mid
] == target
) {
left
= mid
+ 1;
}
}
if (right
< 0 || nums
[right
] != target
)
return -1;
return right
;
}
作者:labuladong
链接:https
://leetcode
-cn
.com
/problems
/find
-first
-and-last
-position
-of
-element
-in
-sorted
-array
/solution
/er
-fen
-cha
-zhao
-suan
-fa
-xi
-jie
-xiang
-jie
-by
-labula
/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
三、二叉树遍历
1. 递归
1). 先序
void _PreOrder(PNode
& pRoot
)
{
if (pRoot
)
{
cout
<< pRoot
->_data
<< " ";
_PreOrder(pRoot
->_LChild
);
_PreOrder(pRoot
->_RChild
);
}
}
void PreOrder()
{
_PreOrder(_pRoot
);
cout
<< endl
;
}
2).中序
void _InOrder(PNode
& pRoot
)
{
if (pRoot
)
{
_InOrder(pRoot
->_LChild
);
cout
<< pRoot
->_data
<< " ";
_InOrder(pRoot
->_RChild
);
}
}
void InOrder()
{
_InOrder(_pRoot
);
cout
<< endl
;
}
3).后序
void _PostOrder(PNode
& pRoot
)
{
if (pRoot
)
{
_PostOrder(pRoot
->_LChild
);
_PostOrder(pRoot
->_RChild
);
cout
<< pRoot
->_data
<< " ";
}
}
void PostOrder()
{
_PostOrder(_pRoot
);
cout
<< endl
;
}