算法笔记从零开始
2020/1/16
前言
每天坚持写点东西,从基础算法开始做起;
今日算法01:归并排序
时间复杂度:O(nlogn)
1.递归实现:
#include<cstdio>
const int maxn = 100;
int calcount = 0;//统计计算次数;
void merge(int A[], int L1, int R1, int L2, int R2) {
int i = L1, j = L2;
int temp[maxn], k = 0;
while (i<=R1&&j<=R2)
{
if (A[i] <= A[j]) {
temp[k++] = A[i++];
}
else
{
temp[k++] = A[j++];
}
}
while (i <= R1)temp[k++] = A[i++];
while (j <= R2)temp[k++] = A[j++];
//return temp;
for (int i = 0; i < k; i++)
{
A[L1 + i] = temp[i];
printf("%d ",temp[i]);
}
printf("\n");
}
void mergeSort(int A[], int left, int right){
if (left<right)
{
int mid = (left + right) / 2;
mergeSort(A, left, mid);
mergeSort(A, mid+1, right);
merge(A, left, mid, mid + 1, right);
//printf("%d", ++calcount);
}
}
int main() {
int A[maxn] = { 1,4,5,6,7,8,80,15,30,17 };
mergeSort(A,0,9);
for (int i = 0; i < 10; i++)
{
printf("%d ", A[i]);
}
return 0;
}
非递归算法:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100;
int calcount = 0;
void merge(int A[], int L1, int R1, int L2, int R2) {
int i = L1, j = L2;
int temp[maxn], k = 0;
while (i<=R1&&j<=R2)
{
if (A[i] <= A[j]) {
temp[k++] = A[i++];
}
else
{
temp[k++] = A[j++];
}
}
while (i <= R1)temp[k++] = A[i++];
while (j <= R2)temp[k++] = A[j++];
//return temp;
for (int i = 0; i < k; i++)
{
A[L1 + i] = temp[i];
printf("%d ",temp[i]);
}
printf("\n");
}
void mergeSort(int A[],int n) {
for (int step = 2; step/2 <= n; step*=2)
{
for (int i = 0; i <= n ; i+=step)
{
int mid = i + step / 2 - 1;
if (mid + 1 <= n) {
merge(A, i, mid, mid + 1, min(i + step - 1, n));
}
}
}
}
int main() {
int A[maxn] = { 1,4,5,6,7,8,80,15,30,17 };
mergeSort(A,9);
for (int i = 0; i < 10; i++)
{
printf("%d ", A[i]);
}
return 0;
}
今日算法02:快速排序:
时间复杂度O(nlogn)
#include<cstdio>
const int maxn = 100;
int calcount = 0;
int Partition(int a[], int left, int right) {
int temp = a[left];
while (right>left)
{
while(a[right] > temp&&left < right)right--;
a[left] = a[right];
while (a[left] <= temp && left < right)left++;
a[right] = a[left];
}
a[left] = temp;
return left;
}
//递归实现
void quickSort(int a[], int left, int right) {
if (left < right) {
int pos = Partition(a, left, right);
quickSort(a, left, pos - 1);
quickSort(a, pos+1, right);
}
}
int main() {
int A[maxn] = { 1,4,5,6,7,8,80,15,30,17 };
quickSort(A, 0, 9);
for (int i = 0; i < 10; i++)
{
printf("%d ", A[i]);
}
return 0;
}
参考晴神的《算法笔记》