一些基础算法和数据结构的C++代码

一些基础算法和数据结构的C++代码


B站主页
知乎主页
github主页


排序算法

github地址

快排

template<class T>
void QuickSort(int l, int r, T arr[])
{
	if (l >= r)
		return;
	T base = arr[r];
	T pl = l, pr = r;
	while (pl != pr)
	{
		while (pl < pr && arr[pl] <= base)
			++pl;
		arr[pr] = arr[pl];
		while (pl < pr && arr[pr] >= base)
			--pr;
		arr[pl] = arr[pr];
	}
	arr[pr] = base;
	QuickSort(l, pr - 1, arr);
	QuickSort(pr + 1, r, arr);
}

冒泡

template<class T>
void BubbleSort(int l, int r, T arr[])
{
	T temp;
	for (int i = l; i < r; ++i)
		for (int j = l; j < r - i; ++j)
			if (arr[j] > arr[j + 1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
}

插入

template<class T>
void StraightInsertionSort(int l, int r, T arr[])
{
	for (int crr = l + 1; crr <= r; ++crr)
	{
		int p;
		T temp = arr[crr];
		for (p = crr - 1; p >= l && arr[p] > temp; --p)
			arr[p + 1] = arr[p];
		arr[p + 1] = temp;
	}

}

希尔

template<class T>
void ShellSort(int l, int r, T arr[])
{
	int increment = r - l + 1;
	do
	{	increment = increment / 3 + 1;
		for (int start = l; start < l + increment; ++start)
		{
			int nmax = (r - start) / increment;
			for (int crr = start + increment; crr <= start + increment * nmax; crr += increment)
			{
				int p;
				T temp = arr[crr];
				for (p = crr - increment; p >= start && arr[p] > temp; p -= increment)
					arr[p + increment] = arr[p];
				arr[p + increment] = temp;
			}
		}
		
	} while (increment > 1);
}

归并

template<class T>
void MergeSort(int l, int r, T arr[])
{
	if (l == r)
		return;
	int mid = (l + r) / 2, lenth = r - l + 1;
	MergeSort(l, mid, arr);
	MergeSort(mid + 1, r, arr);
	T* temp = new T[lenth];
	for (int p1 = l, p2 = mid + 1, i = 0; i < lenth; ++i)
		if (p1 <= mid && p2 <= r)
			temp[i] = arr[p1] > arr[p2] ? arr[p2++] : arr[p1++];
		else
			if (p1 > mid)
				temp[i] = arr[p2++];
			else
				temp[i] = arr[p1++];
	for (int i = 0; i < lenth; ++i)
		arr[i + l] = temp[i];
}

数据结构

github地址

单向链表

template<class T = int>class LinkedList
{
	int number;
	class Node
	{
	public:
		T val;
		Node* next;
		Node()
		{
			next = NULL;
		};
		Node(T x)
		{
			next = NULL;
			val = x;
		};
	};
	Node *head, *crr;
public:
	LinkedList()
	{
		number = 0;
	};
	~LinkedList()
	{
	};
	void insert(T x)
	{
		Node *newNode = new Node(x);
		if (number == 0)
			head = newNode;
		else
		{
			crr = head;
			while (crr->next != NULL)
				crr = crr->next;
			crr->next = newNode;
		}
		++number;
	};
	void del()
	{
		if (number < 2)
		{
			delete head;
			head = NULL;
			--number;
			return;
		}
		for (crr = head; crr->next->next != NULL;)
			crr = crr->next;
		delete crr->next;
		crr->next = NULL;
		--number;
	};
	void prints()
	{
		for (crr = head; crr != NULL; crr = crr->next)
			cout << crr->val << " ";
		cout << endl << number;
	};
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值