0
点赞
收藏
分享

微信扫一扫

机器学习lgbm时间序列预测实战

黄昏孤酒 03-25 08:02 阅读 3

1.选择排序

直接遍历数组,找出最大值和最小值,记录下标,将最大值和最小值分别与首位交换

但是由于当begin == maxi时,会导致出错,因此需要 if 特殊判断

void Swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void SelectSort(int* a, int n)
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{
        //选出最大最小值的位置
		int maxi = end;
		int mini = begin;
		for (int i = begin; i <= end; i++)
		{
			if (a[end] < a[i])
			{
				maxi = i;
			}

			if (a[begin] > a[i])
			{
				mini = i;
			}
		}
		Swap(&a[begin], &a[mini]);
		if (maxi == begin)
		{
			maxi = mini;
		}
		Swap(&a[end], &a[maxi]);
		begin++;
		end--;
	}
	
}

2.快速排序

快速排序是一种基于二叉树结构的排序

首先将数组的开头作为关键字key,

并设置左右指针left 和 right 分别从头尾开始寻找比key的值大和小的数,(right先走,left后走)

并将二者交换,直到left >= right,

并将key与 left 和 right 所指向的值(比key小)交换,

注:相遇位置一定比key小

原因:

1.L遇到R:R先走,R在比key小的位置停下,L没有找到比key大的数,L与R就会相遇,相遇位置就比key小

2.R遇到L:

(1).第一轮交换过后先交换了则L位置的值一定小于key,R的位置一定大于key,R继续走,找比key小的数,没找到,与L相遇,相遇位置就是L停的位置,一定比key小

(2).第一轮就没找到比key大的数,R与L相遇,此时L还没有开始走,则L在key的位置,相遇位置就是key的位置

这样key的左边就全是比他小的数,key的右边就全是比key大的数,

即key的位置放对了,

之后将数组以已经放好的key为边界分割

进行递归,直到所有递归完成,每一部分都只剩一个节点,就完成了

void QuickSort(int* a, int left, int right)
{
	if (left >= right)
		return;
	
	int begin = left, end = right;

	int keyi = left;
	while (left < right)
	{
		while (left < right && a[right] > a[keyi])
		{
			right--;
		}

		while (a[left] < a[keyi] && left < right)
		{
			left++;
		}

		Swap(&a[left], &a[right]);
	}

	Swap(&a[left], &a[keyi]);

	keyi = left;

	QuickSort(a, begin, keyi - 1);
	QuickSort(a, keyi + 1, end);
}
举报

相关推荐

0 条评论