排序算法6---快速排序(非递归)(C)

        回顾递归的快速排序,都是先找到key中间值,然后递归左区间,右区间。

        那么是否可以实现非递归的快排呢?答案是对的,这里需要借助数据结构的。将右区间左区间压栈(后进先出),然后取出左区间,再将左区间的子右区间和子左区间压栈,再取出左区间的子左区间......,当栈为空时,即全部取出,此时已经有序。f2411c060f1945129eabf66cf4da911c.png

5b3c8442dda544c1a16c2f3b9d702693.png 

 

        和递归一样,首先用三数取中来优化:

//三数取中
int GetMidi(int* arr, int begin, int end)
{
	int midi = (begin + end) / 2;
	if ((arr[begin] > arr[midi] && arr[begin] < arr[end])
		|| (arr[begin]) > arr[end] && arr[begin] < arr[midi])
		midi = begin;
	if ((arr[end] > arr[midi] && arr[end] < arr[begin])
		|| (arr[end]) > arr[begin] && arr[end] < arr[midi])
		midi = end;
	return midi;
}

        接着借用递归快排的指针法,来进行单趟排序,得到中间基准值,并划分做右区间(不记得指针法的回看博客)

int QuickSort_pointer_incline(int* arr, int begin, int end)
{
	int midi = GetMidi(arr, begin, end);
	Swap(&arr[begin], &arr[midi]);

	int keyi = begin;
	int prev = begin, cur = prev + 1;
	while (cur <= end)
	{
		if (arr[cur] < arr[keyi] && ++prev != cur)
			Swap(&arr[prev], &arr[cur]);
		++cur;
	}
	Swap(&arr[prev], &arr[keyi]);
	keyi = prev;
	return keyi;
}

        最后使用栈来压栈出栈

void QuickSort_NonR_incline(int* arr, int begin, int end)
{
	ST s;
	STInit(&s);

	//放入端点
	//因为后进先出,所以先入右,后入左,区间[左,右]
	STPush(&s, end);
	STPush(&s, begin);

	while (!STEmpyty(&s))
	{
		//出栈
		int left = STTop(&s);
		STPop(&s);
		int right = STTop(&s);
		STPop(&s);

		//指针单趟排序
		int keyi = QuickSort_pointer_incline(arr, left, right);
		//[left,keyi-1],keyi,[keyi+1,right]

		
		//入右区间,同样先入右区间的右端点,再左端点
		if (keyi + 1 < right)
		{
			STPush(&s, right);
			STPush(&s, keyi + 1);
		}
		//入左区间,同样先入左区间的右端点,再左端点
		if (left < keyi - 1)
		{
			STPush(&s, keyi - 1);
			STPush(&s, left);
		}

		//循环回去,又取出区间,再次单趟排序后,又入子右区间,子左区间
	}

	STDestroy(&s);
}

 

 

相关推荐

  1. 式实现快速排序

    2024-01-19 07:28:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-19 07:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-19 07:28:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-19 07:28:02       82 阅读
  4. Python语言-面向对象

    2024-01-19 07:28:02       91 阅读

热门阅读

  1. 使用Spring管理Caffeine缓存(CacheManager+Caffeine)

    2024-01-19 07:28:02       51 阅读
  2. 家庭家用服务全方面机器人

    2024-01-19 07:28:02       58 阅读
  3. axios的使用以及Vue动画

    2024-01-19 07:28:02       55 阅读
  4. axios原理

    2024-01-19 07:28:02       54 阅读
  5. Dynamo 使用小结

    2024-01-19 07:28:02       49 阅读
  6. spark+phoenix读取hbase

    2024-01-19 07:28:02       49 阅读
  7. 情绪价值怎么自己给自己

    2024-01-19 07:28:02       53 阅读
  8. 【排序算法】快速排序的基本算法

    2024-01-19 07:28:02       47 阅读
  9. Cmake 中list命令总结

    2024-01-19 07:28:02       54 阅读