从零开始的编程

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;
}

图片来源于晴神的算法笔记

参考晴神的《算法笔记》

发布了6 篇原创文章 · 获赞 6 · 访问量 125

猜你喜欢

转载自blog.csdn.net/qq_41148778/article/details/104010031