C++的排序

2023-11-13


在这里插入图片描述


稳定排序(排序前后两个相等的数的相对位置不变):归并排序、冒泡排序、插入排序、基数排序;
非稳定排序:希尔排序、堆排序、选择排序、快速排序。

1.快速排序

快速排序采用分而治之的思想,选取基准值,第一次排序之后将小于等于基准值的值都放在该值前面,将大于等于基准值的值都放在该值后面,接下来对前面的和后面的再次进行快速排序,分而治之直到无法再“分”为止。

#include <iostream>
#include <vector>
#include <string>
#include <fstream>

using namespace std;

int Paritition(vector<int> &array, int left, int right) {
	int tmp = array[left];//选取一个基准值

	while (left < right) {
		while (left < right && tmp <= array[right]) {
			right--;//基准值小于等于后面的值 右指针左移
		}
		if (left < right) array[left++] = array[right]; //将后边小于基准值的值放在前面,左指针右移

		while (left < right && tmp > array[left]) {
			left++;//基准值大于后面的值 左指针右移
		}
		if (left < right) array[right--] = array[left];//将前面大于等于基准值的值放在后面,右指针左移
	}

	array[left] = tmp;//左右指针重合 存入基准值
	return left; //此时left的前面值都小于基准值, 后面的值都大于基准值
}

void QuickSort(vector<int> &array, int &left, int &right) {
	if (left >= right) return;

	//分而治之
	int mid = Paritition(array, left, right);//分为两部分
	QuickSort(array, left, mid - 1);//前半部分
	QuickSort(array, mid + 1, right);//后半部分
}

int main(int argc, char* argv[]) {
	vector<int> array;
	int num;

	while (1) {
		cin >> num;
		array.push_back(num);

		if (cin.get() == '\n') break;
	}

	int left = 0, right = array.size() - 1;
	QuickSort(array, left, right);//快速排序函数

	for (int i = 0; i < array.size(); i++) {
		cout << array[i] << " ";
	}

	return -1;
}

//优化快速排序

以下代码有三种快速排序的写法,参考STL标准模板库对快速排序进行优化
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

/**************************快排一********************/
void QuickSort_v1(vector<int> &array, int l, int r) {
	if (l >= r) return;

	int x = l, y = r, z = array[l];
	while (x < y) {
		while (x < y && array[y] >= z) --y;
		if (x < y) array[x++] = array[y];
		while (x < y && array[x] <= z) ++x;
		if (x < y) array[y--] = array[x];
	}
	array[x] = z;

	QuickSort_v1(array, x + 1, r);
	QuickSort_v1(array, l, x - 1);
	return;
}


/**************************优化——快排二********************/
#define Swap(a, b) { \
auto _a = a; \
a = b, b = _a; \
}

//三点取中法
inline int midian(int a, int b, int c) {
	if (a > b) Swap(a, b);
	if (a > c) Swap(a, c);
	if (b > c) Swap(b, c);
	return b;
}

void QuickSort_v2(vector<int> &array, int l, int r) {
	while (l < r) {
		int x = l, y = r, z = midian(array[l], array[(l + r) >> 1], array[r]);
		//无监督
		do {
			while (array[x] < z) ++x;
			while (array[y] > z) --y;
			if (x <= y) {
				Swap(array[x], array[y]);
				++x, --y;
			}
		} while (x <= y);

		QuickSort_v2(array, x, r);
		r = y; //单边递归
	}
	return;
}


/**************************优化——快排三********************/

const int threshold = 16;

void _QuickSort_v3(vector<int> &arr, int l, int r) {
	while (r - l > threshold) {
		int x = l, y = r, z = midian(arr[l], arr[(l + r) >> 1], arr[r]);
		//无监督
		do {
			while (arr[x] < z) ++x;
			while (arr[y] > z) --y;
			if (x <= y) {
				Swap(arr[x], arr[y]);
				++x, --y;
			}
		} while (x <= y);

		_QuickSort_v3(arr, x, r);
		r = y;//单边递归
	}
	return;
}

void InsertSort(vector<int> &arr, int l, int r) {
	int ind = l;
	for (int i = l + 1; i <= r; i++) {
		if (arr[ind] > arr[i]) ind = i;
	}
	Swap(arr[ind], arr[l]);

	for (int i = l + 2; i <= r; i++) {
		int j = i;
		while (arr[j] < arr[j - 1]) {
			Swap(arr[j], arr[j - 1]);
			--j;
		}
	}
	return;
}

void QuickSort_v3(vector<int> &arr, int l, int r) {
	_QuickSort_v3(arr, l, r);//数组大小超过16使用快速排序
	InsertSort(arr, l, r); //小于16用插入排序
	return;
}


int main(int argc, char* argv[]) {
	vector<int> array;
	int num;

	while (1) {
		cin >> num;
		array.push_back(num);

		if (cin.get() == '\n') break;
	}

	//QuickSort_v1(array, 0, array.size() - 1);
	//QuickSort_v2(array, 0, array.size() - 1);
	QuickSort_v3(array, 0, array.size() - 1);

	for (int i = 0; i < array.size(); i++) {
		cout << array[i] << " ";
	}

	return -1;
}

2.插入排序

在快速排序中第三个版本已使用。
先选定第一个值为最小(第一个for循环),之后从下一位开始进行比较填充,每次保证从第一位到第j位有序(for循环中使用while循环)

void InsertSort(vector<int> &arr, int l, int r) {
	int ind = l;
	for (int i = l + 1; i <= r; i++) {
		if (arr[ind] > arr[i]) ind = i;
	}
	Swap(arr[ind], arr[l]);

	for (int i = l + 2; i <= r; i++) {
		int j = i;
		while (arr[j] < arr[j - 1]) {
			Swap(arr[j], arr[j - 1]);
			--j;
		}
	}
	return;
}

3.选择排序

每次选中一个值,将该值与后面所有的值进行比较,最终给每个位置选择当前元素最小的值。

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

void Swap(vector<int>& array, int i, int j) {
	int tmp = array[i];
	array[i] = array[j];
	array[j] = tmp;
}

void SelectSort(vector<int>& array) {
	if (array.size() < 2) return;

	for (int i = 0; i < array.size() - 1; i++) {
		int minCur = i;
		for (int j = i + 1; j < array.size(); j++) {
			minCur = array[j] < array[minCur] ? j : minCur;
		}
		Swap(array, i, minCur);
	}
}

int main(int argc, char* argv[]) {
	vector<int> array;
	int num;

	while (1) {
		cin >> num;
		array.push_back(num);

		if (cin.get() == '\n') break;
	}

	SelectSort(array);

	for (int i = 0; i < array.size(); i++) {
		cout << array[i] << " ";
	}

	return -1;
}

4.冒泡排序

重复地遍历要排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来,这样在最后的元素应该会是最大的数。

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

void Swap(vector<int>& array, int i, int j) {
	array[i] = array[i] ^ array[j];
	array[j] = array[i] ^ array[j];
	array[i] = array[i] ^ array[j];
	/*int tmp = array[i];
	array[i] = array[j];
	array[j] = tmp;*/
}

void BubbleSort(vector<int>& array) {
	if (array.size() < 2) return;

	for (int i = 0; i < array.size(); i++) {
		for (int j = 0; j < array.size() - i - 1; j++) {
			if (array[j] > array[j + 1]) {
				Swap(array, j, j + 1); //在最后的元素应该会是最大的数
			}
		}
		
	}
}

int main(int argc, char* argv[]) {
	vector<int> array;
	int num;

	while (1) {
		cin >> num;
		array.push_back(num);

		if (cin.get() == '\n') break;
	}

	BubbleSort(array);

	for (int i = 0; i < array.size(); i++) {
		cout << array[i] << " ";
	}

	return -1;
}

5.归并排序

求出中点位置,先让左侧排好序,再让右边排好序(分而治之),之后往一块整合(类似合并两个有序数组),整合到辅助数组里,之后再整体放回原数组。
可以用来解决“逆序对”系列问题。

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

void merge(vector<int>& arr, int l, int mid, int r) {
	vector<int> help;// (r - l + 1, 0); //每次递归都会是一个新的help数组

	int p1 = l;
	int p2 = mid + 1;

	int tmp = 0;
	while (p1 <= mid || p2 <= r) {
		if (p1 == mid + 1) {//越界
			tmp = arr[p2++];
		}
		else if (p2 == r + 1) { //越界
			tmp = arr[p1++];
		}
		else if(arr[p1] < arr[p2]){
			tmp = arr[p1++];
		}
		else{
			tmp = arr[p2++];
		}

		help.push_back(tmp);
	}

	for (int i = 0; i < help.size(); i++) {
		arr[l + i] = help[i];//但是arr不是新的数组
	}

	return;
}

void MergeSort(vector<int>& arr, int l, int r) {
	if (l == r) return;

	int mid = l + ((r - l) >> 1);

	MergeSort(arr, l, mid);
	MergeSort(arr, mid + 1, r);
	merge(arr, l, mid, r);
	return;
}

int main(int argc, char* argv[]) {
	vector<int> arr;
	int num;

	while (1) {
		cin >> num;
		arr.push_back(num);

		if (cin.get() == '\n') break;
	}

	MergeSort(arr, 0, arr.size() - 1);

	for (int i = 0; i < arr.size(); i++) {
		cout << arr[i] << " ";
	}

	return -1;
}

6.堆排序

堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的键值或索引总是小于(小根堆)(或者大于(大根堆))它的父节点。

先将第一位变为整个数组大根堆的父节点,再将最后一个数和第一个数做交换,这样可确保最大值在最后一位,然后整个数组大小(heapSize)减一(将最后一位“断联”)。
之后从第0位往下判断是否还能下移,以确保前面的数组依然为大根堆,之后交换,heapSize减一。知道heapSize为0,排序完成。

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

//左子节点:2*i+1
//右子节点:2*i+2
//父节点:(i-1)/2

#define Swap(a, b) { \
auto _a = a; \
a = b, b = _a; \
}

//堆插入
void HeapInsert(vector<int>& arr, int idx) {
	while (arr[idx] > arr[(idx - 1) / 2]) { //当前值和父的值作比较 看能否上移
		Swap(arr[idx], arr[(idx - 1) / 2]);
		idx = (idx - 1) / 2; //
	}
}

//某个数在idx位置(看作父位置),能否往下移动
void HeapIfy(vector<int>& arr, int idx, int heapSize) {
	int left = idx * 2 + 1; //左孩子的下标
	while (left < heapSize) { //下方还有孩子
		//两个孩子中,谁的值大,把下标给largest
		int largest = left + 1 < heapSize && arr[left + 1] > arr[left] ? left + 1 : left;
		//父和较大的孩子之间,谁的值大,把下标给largest
		largest = arr[largest] > arr[idx] ? largest : idx;

		if (largest == idx) { //最大值就是当前父位置
			break;
		}

		Swap(arr[largest], arr[idx]); 
		idx = largest; //索引值的变化
		left = idx * 2 + 1; //
	}
}

void HeapSort(vector<int>& arr) {
	if (arr.empty() || arr.size() < 2) {
		return;
	}

	//把数组整体范围全变成大根堆
	/*for (int i = 0; i < arr.size(); i++) {
		HeapInsert(arr, i); //O(logN) //这时只能保证首位值最大,其他只是满足大根堆 不一定有序
	}*/
	//效率更高的办法
	for (int i = arr.size() - 1; i >= 0; i--) {
		HeapIfy(arr, i, arr.size());
	}

	int heapSize = arr.size();
	Swap(arr[0], arr[heapSize - 1]); //首位和最后一位做交换,此时最后一位必是最大值
	heapSize--; //最后一位“断联”
	
	while (heapSize > 0) {
		HeapIfy(arr, 0, heapSize);
		Swap(arr[0], arr[heapSize - 1]);
		heapSize--; //最后一位“断联”
	}
}

int main(int argc, char* argv[]) {
	vector<int> arr;
	int num;

	while (1) {
		cin >> num;
		arr.push_back(num);

		if (cin.get() == '\n') break;
	}

	HeapSort(arr);

	for (int i = 0; i < arr.size(); i++) {
		cout << arr[i] << " ";
	}

	return -1;
}

7.计数排序

计数排序 的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

8.桶排序

桶排序 是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。
假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序。

9.基数排序

对每一位进行排序,从最低位开始排序。按照低位先排序,然后收集(根据count前缀和数组存入help数组);再按照高位排序,然后再收集;依次类推,直到最高位。(也可认为是优先级低的先排序,高优先级的再排序)。
即先根据个位数字排序,再根据十位数字排序,再根据百位数字排序…

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

//最大值有几个十进制位
int maxbits(vector<int>& arr) {
	int _max = INT_MIN;
	for (int i = 0; i < arr.size(); i++) {
		_max = max(_max, arr[i]);
	}

	int res = 0;
	while (_max |= 0) {
		res++;
		_max /= 10;
	}

	return res;
}

//将x的第d位的数字拿出来
int GetDigit(int x, int d) {
	for (int i = 1; i < d; i++) { //d >= 1
		x /= 10;		
	}
	x %= 10;
	return x;
}

//在left到right范围内排序
void _RadixSort(vector<int>& arr, const int left, const int right, int digit) {
	const int radix = 10; //"前缀和"的最大空间
	vector<int> help(right - left + 1);

	int i = 0;
	
	for (int d = 1; d <= digit; d++) { //入桶出桶的次数 //最大值的位数 //排序的次数
		int count[radix] = { 0 }; // //count[1]表示当前位是0和1的数字有多少个(小于等于1的个数)
		
		for (i = left; i <= right; i++) {
			int j = GetDigit(arr[i], d); //依次拿出arr数组中每个数 第d位上 值为j的总个数 (d = 1是个位)
			count[j]++; //个数放进count数组中
		}

		for (i = 1; i < radix; i++) {
			count[i] += count[i - 1]; //处理成前缀和
		}
		
		//数组从右往左遍历
		for (i = right; i >= left; i--) {
			int j = GetDigit(arr[i], d); //拿出位数		
			help[count[j] - 1] = arr[i]; //填进辅助数组			
			count[j]--; //前缀和那个词频(个数) 减一
		}
		
		//维护本次出桶的结果再放回arr
		for (i = left; i <= right; i++) { //
			arr[i] = help[i]; //
		}
	}
}

void RadixSort(vector<int>& arr) {
	if (arr.empty() || arr.size() < 2) {
		return;
	}
	_RadixSort(arr, 0, arr.size() - 1, maxbits(arr));
}


int main(int argc, char* argv[]) {
	vector<int> arr;
	int num;

	while (1) {
		cin >> num;
		arr.push_back(num);

		if (cin.get() == '\n') break;
	}

	RadixSort(arr);

	for (int i = 0; i < arr.size(); i++) {
		cout << arr[i] << " ";
	}

	return -1;
}

10.希尔排序

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本。

11.补充

【注】可以使用系统自带的sort函数与自己写的排序函数进行对数器比对,以测试自己写的是否正确。

产生随机数进行测试并检查排序函数:

#define MAX_N 100
vector<int> arr;
void GetRandData(int n) {
	for (int i = 0; i < n; i++) {
		arr.push_back(rand() % n);
	}
	return;
}

int Check(vector<int> &arr, int n) {
	for (int i = 1; i < n; i++) {
		if (arr[i] < arr[i - 1]) return 0;
	}
	return 1;
}

int main(int argc, char* argv[]) {
	vector<int> array;
	srand(time(0));
	GetRandData(MAX_N);
	array = arr;
	
	if (Check(array, MAX_N) == 1) {
		cout << "排序正确" << endl;
	}
	
	return -1;
}

超详细十大经典排序算法总结(java代码)c或者cpp的也可以明白

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++的排序 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 常用正则表达式

  • python网络爬虫--项目实战--scrapy爬取贝壳网(7)

    一 完整代码 bk py import json import scrapy from ScrapyAdvanced items import HouseItem class BkSpider scrapy Spider name bk a
  • java如何根据模板填充数据生成word文档

    java根据模板填充数据生成word文档 这篇文章干什么 思路总览 1 准备word模板 2 转换文件格式 3 编写代码 补充 下载流 这篇文章干什么 使用代码将word模板内容进行替换 并输出替换后的word 思路总览 1 准备一个wor
  • 计算机很多文件无法删除,电脑有文件删不掉怎么办?电脑有文件删不掉解决方法介绍...

    电脑是我们日常生活中经常使用的一种电子产品 有了电脑之后 我们的生活方式也因此而改变了许多 大多数人都是以电脑作为娱乐产品 电脑让我们在工作学习时资源共享也更方便了一些 效率得到了很大提高 但是作为 高科 技产品 很多人对电脑的使用其实并不
  • 【MATLAB编程学习】自己实现矩阵乘法

    MATLAB编程学习 自己实现矩阵乘法 欢迎关注 高强度更新和MATLAB PYTHON编程 C 编程 算法编程 深度学习 自然语言处理 图像处理 OPENCV等相关知识 这是也给简单的课后题 不过可以帮助我们更好的理解矩阵乘法以及matl
  • 反卷积通俗详细解析与nn.ConvTranspose2d重要参数解释

    文章目录 反卷积的作用 卷积中padding的几个概念 No Padding Half Same Padding Full Padding 反卷积 反卷积中的Padding参数 反卷积的stride参数 反卷积的output padding
  • 0、1编码

    一 声音的0 1编码 1 声音数据的编码过程 声音是一种连续的波 要把连续的波用0 1进行编码 需要经过采样 量化两步完成 1 采样就是每隔一定的时间 测取连续波上的一个振幅值 2 量化就是用一个二进制尺子计量采样得到的每个脉冲 假设有图1
  • openwrt之initramfs-kernel

    在下载openwrt系统时 经常能看到initramfs kernel bin squashfs factory bin squashfs sysupgrade bin等结尾的文件 factory适用于从原厂系统刷到openwrt sysu
  • The “path“ argument must be of type string. Received undefined; at(Object.extname)

    validateString下一行是 Object extname path js 752 5 的报错 原因是在nuxt config js中 把plugins的参数写错了 此处省略大量代码 const baseConfig require
  • Activiti 流程启动及节点流转源码分析

    作者 jiankunking 出处 http blog csdn net jiankunking 本文主要是以activiti study中的xiaomage xml流程图为例进行跟踪分析 具体的流程图如下 流程图对应的XML文件如下
  • unity 绘制属性雷达图 - 绘制描边(更改uv)

    实现的效果 先绘制一个五边形的mesh 然后在给边缘绘制一圈mesh 对uv进行重新赋值 实现描边效果 第一步 绘制mesh 绘制多边形mesh 首先先绘制一个五边形 mesh绘制要素 顶点 三角形 uv信息 顶点信息 就是勾勒三角形用的几
  • nginx静态代理设置二:静态文件在别的服务器

    动静结合 把网络上的路径映射成自己的虚拟机 修改共享的文件夹 映射的虚拟机也会同步更新 映射别的电脑的文件夹的时候要关闭防火墙 否则会一直连不上 1 新建静态文件夹StaticProxy 然后共享 选择账户Everyone就可以 2 本机测
  • void指针(void *)是什么?

    void 指针的使用规则 1 void 指针可以指向任意类型的数据 就是说可以用任意类型的指针对 void 指针赋值 例如 int a void p p a 如果要将 void 指针 p 赋给其他类型的指针 则需要强制类型转换 就本例而言
  • yii2学习笔记 --- 基础版配置链接多个数据库

    打开 config db php return class gt yii db Connection dsn gt mysql host localhost dbname yii2basic username gt root passwor
  • Qt数据库总结

    include
  • GD32F103配置PA15 PB3 PB4为普通IO

    PB3 PB4 PA15 作为普通IO时候 需要disable JTAG 释放出来 gpio pin remap config GPIO SWJ SWDPENABLE REMAP ENABLE 这个语句很重要 Function Key Sc
  • vue使用dhtmlx-gantt

    根据需求制作甘特图 绘制两时间段 相交地方为深颜色 没找到可以直接用的插件 于是就靠自己手动计算时间差与时间比例 但所得结果有部分误差 有更好组件欢迎交流 安装 npm install dhtmlx gantt save index js
  • Mysql数据库,查询结果为空值,如何处理?

    当sql查出空值的时候 如果想要获取 其中的值可能会出错 a res getString 字段 如果该字段的值是null 就会报错 所以需要在取字段值的时候做try catch 处理 try a res getString 字段 catch
  • unityShader物体表面流光效果

    本文转载自http blog csdn net lyh916 article details 51831720 参考链接 http liweizhaolili blog 163 com blog static 162307442012726
  • C++的排序

    C 十大排序 1 快速排序 2 插入排序 3 选择排序 4 冒泡排序 5 归并排序 6 堆排序 7 计数排序 8 桶排序 9 基数排序 10 希尔排序 11 补充 稳定排序 排序前后两个相等的数的相对位置不变 归并排序 冒泡排序 插入排序