快速排序———挖坑填补法

快排的基本思路:

首先将数组的第一个数字作为标准值;然后我们只需要找到该数组在排好序后的数组中的位置,在此位置之前的数字都比该数字小,在此位置之后的数字都比还数字大。

下面介绍一下怎么找到标准值的位置:

1 先将标准值保存,腾出标准值的位置,出坑(注 坑不是实际意义上的空间,而是我们假象的,只需要保存标准时即可)

2 从后面向前找到比标准值小的数字,放在坑里,这样又腾出一个位置

3 再从前向后找到比标准值大的数字 放在坑里

循环找到标准值的位置,最后将数字分成两部分,标准值前的数字较小,标准值后的数字较大,然后将这两部分再进行排序操作(我们使用的是递归的方式)

这样讲的太抽象 下面我,我们看一下代码:

#include<stdio.h>
//快速排序(挖坑填补法):设定标准值(一般设定为首元素),先从后向前找比标准值小的数,找到之后放入标准值位置;再从前向后找比标准值大的数放入刚才找到的位置,最后将空位插入标准值,
//标准值将前后划分开,标准值之前的书都比标准值小,标准值后的数都比标准值大
int Sort(int arr[],int nLow,int nHigh)
{
	int temp;
	temp = arr[nLow];//将第一位设定为标准值

	while(nLow < nHigh)
	{
		//从后向前找比标准值小的
		while(nHigh > nLow)
		{
			if(arr[nHigh] < temp)
			{
				//找到之后,放到标准值位
				arr[nLow] = arr[nHigh];
				nLow++;
				break;
			}
			nHigh--;
		}

		//从前向后找比标准值大的
		while(nLow < nHigh)
		{
			if(arr[nLow] > temp)//找到之后放到上一轮循环中的已经修改的最大位置
			{
				arr[nHigh] = arr[nLow];
				nHigh--;
				break;
			}
			nLow++;
		}
	}

	//nMin>=nMax时,循环条件结束,标准值放入,并将位置返回
	arr[nLow] = temp;//此时nLow和nHigh相同
	return nLow;
}




void QuickSort(int arr[],int nLow,int nHigh)
{
	//递归循环的结束条件
	if(arr == NULL|| nLow >= nHigh)return;

	//招标准值位置
	int nStandard;
	nStandard = Sort(arr,nLow,nHigh);

	//根据标准值位置 将数组分成两部分 各部分分别执行以上操作
	QuickSort(arr,nLow,nStandard-1);
	QuickSort(arr,nStandard+1,nHigh);
}

int main()
{
	int arr[] = {10,9,20,39,441,709,27,11,87};
	QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);

	int i;
	for(i = 0;i<sizeof(arr)/sizeof(arr[0]);i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

 

### 使用挖坑实现快速排序的图例与可视化 #### 挖坑简介 挖坑是一种常见的原地交换方,在快速排序中用于元素之间的比较和移动。该方通过选定一个基准值,将小于基准值的元素移到左边,大于基准值的元素移到右边。 #### 排序过程描述 在每次迭代过程中,选择数组中的第一个元素作为基准值,随后从右向左寻找比基准值小的第一个数入“坑位”,再从左往右找比基准值大的数补刚才找到的小数值的位置,依次类推直到完成一轮遍历并最终确定基准位置[^1]。 ```python def quick_sort_pit(arr, low, high): if low >= high: return i = low j = high pivot = arr[low] while i < j: while i < j and arr[j] >= pivot: j -= 1 arr[i] = arr[j] while i < j and arr[i] <= pivot: i += 1 arr[j] = arr[i] arr[i] = pivot quick_sort_pit(arr, low, i - 1) quick_sort_pit(arr, i + 1, high) arr_example = [64, 34, 25, 12, 22, 11, 90] quick_sort_pit(arr_example, 0, len(arr_example) - 1) print(f"Sorted array is {arr_example}") ``` 为了更好地理解这个过程,可以利用`matplotlib`库来绘制动画效果展示每一步的变化情况: ```python import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() bars = ax.bar(range(len(arr_example)), arr_example) def animate(frame_index): global arr_example if frame_index == 0 or not (frame_index % 2): # Only perform sort on even frames to slow down animation for clarity. quick_sort_pit(arr_example, 0, len(arr_example) - 1) heights = arr_example[:] for bar, height in zip(bars.patches, heights): bar.set_height(height) return bars ani = FuncAnimation(fig, func=animate, frames=len(arr_example)*2, interval=700, repeat=False) plt.show() ``` 上述代码片段展示了如何使用Python内置绘图工具Matplotlib创建动态图表,以直观的方式呈现数据结构随时间变化的趋势。这里设置了一个简单的动画循环,每隔一定帧更新一次柱状图的高度,从而模拟出整个排序的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值