快速算法实现----挖坑填数

本文详细介绍了快速排序算法的实现原理及步骤,通过形象的挖坑填数方式解释了快速排序的过程,并给出了具体的代码实现。

快速排序作为时间复杂度为o(nlogn)的算法,在实际中经常用到。下面简单的讲解一下快速排序算法的实现思路。

看到网上http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html这位大牛的思路写的非常好。挖坑填数,非常形象。下面简单的介绍一下。

快速排序用到时分治法的思想。主要可以分为以下的三步。

1、选定一个数作为基数

2、将大于这个的基数的数全放在右边,小于这个基数的数全部放在左边

3、对左右区间中的数重复1、2步骤,直到区间中只有一个数。

这样描述可能有一点难以理解,我们可以用挖坑+填数的方式来很好的理解

1、对于数组a,实现l到r的排序,首先挖坑key=a[l],令i=l,j=r,此时形成第一个坑a[i]

2、j--直到a[j]小于key的地方,令a[i]=a[j],此时a[j]形成一个新的坑,i++

3、i++直到a[i]大于key的地方,令a[j]=a[i],填上坑a[j],此时a[i]形成新的坑,j--

4、再重复执行23二步,直到i==j,将key填入a[i]

进经过上面的一番讲解,突然一下子变得清晰明了了。

代码实现就很简单了。

//一次划分
int partion(int a[],int left,int right)
{
	//先将第一个数设置成一个坑a[left]
	int i=left,j=right;
	int key=a[left];
	while(i<j)
	{
		//从最右端开始寻找小于key的数,如果大于,则j--
		while(i<j&&a[j]>=key)
			j--;
		//如找到且i<j,将a[i]这个坑填上,形成一个新坑a[j],i++
		if(i<j)
		{	
			a[i]=a[j];
			i++;
		}
		//从左边的i开始找,如果小于key,i++
		while(i<j&&a[i]<key)
			i++;
		//如找到,并且i<j,将a[j]这个坑填上,形成新坑a[i],j--
		if(i<j)
		{
			a[j]=a[i];
			j--;
		}
	}
	//将key填回坑a[i]
	a[i]=key;
	//返回轴值
	return i;
	
}


void QuickSort(int a[],int left,int right)
{
	//当left<right时
	if(left<right)
	{
		//形成轴值
		int mid=partion(a,left,right);
		//递归左半部分
		QuickSort(a,left,mid-1);
		//递归右半部分
		QuickSort(a,mid+1,right);
	}
}


int main()
{

	int a[]={1,3,2,5,2,4};
	QuickSort(a,0,5);
	for(int i=0;i<6;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

<完>



快速排序的挖坑实现方式是一种经典的分治排序算法,其核心思想是通过递归地将待排序序列分割为较小的子序列来完成排序。挖坑法的基本思路如下: ### 快速排序的挖坑实现步骤 1. **选择基准值(pivot)**:从组中选择一个元素作为基准值,通常可以选择第一个元素、最后一个元素或中间元素。 2. **初始化“坑”位置**:将基准值保存到一个临时变量`pivot`中,并将其在组中的位置标记为“坑”。 3. **从左向右扫描**:从左指针开始向右移动,找到第一个小于基准值的元素,将其入“坑”中,然后“坑”的位置更新为该元素原来的位置。 4. **从右向左扫描**:从右指针开始向左移动,找到第一个大于或等于基准值的元素,将其入“坑”中,然后“坑”的位置更新为该元素原来的位置。 5. **重复步骤3和4**:直到左右两个指针相遇为止。 6. **将基准值入最后一个“坑”位置**:此时,“坑”所在的位置就是基准值应该放置的正确位置。 7. **递归处理左右子序列**:对基准值左边的子序列和右边的子序列分别重复上述过程,直到所有元素都排列在相应位置上为止。 ### 图解挖坑实现步骤 为了更好地理解挖坑法的实现步骤,可以通过图示的方式展示具体的操作流程。假设我们有一个组`arr = [6, 3, 8, 2, 9, 1]`,我们需要对其进行快速排序。 #### 初始状态 - 组:`[6, 3, 8, 2, 9, 1]` - 基准值:`6` - “坑”位置:索引0 #### 第一步 - 左指针从索引0开始向右移动,找到第一个小于6的元素(即3),将其入“坑”中,此时组变为`[3, 8, 2, 9, 1, 6]`,“坑”位置更新为索引0。 - 右指针从索引5开始向左移动,找到第一个大于或等于6的元素(即6),将其入“坑”中,此时组变为`[3, 8, 2, 9, 1, 6]`,“坑”位置更新为索引5。 #### 第二步 - 左指针从索引1开始向右移动,找到下一个小于6的元素(即2),将其入“坑”中,此时组变为`[3, 8, 2, 9, 1, 6]`,“坑”位置更新为索引2。 - 右指针从索引4开始向左移动,找到下一个大于或等于6的元素(即9),将其入“坑”中,此时组变为`[3, 8, 9, 2, 1, 6]`,“坑”位置更新为索引3。 #### 第三步 - 左指针从索引3开始向右移动,找到下一个小于6的元素(即2),将其入“坑”中,此时组变为`[3, 8, 9, 2, 1, 6]`,“坑”位置更新为索引3。 - 右指针从索引4开始向左移动,找到下一个大于或等于6的元素(即1),将其入“坑”中,此时组变为`[3, 8, 9, 1, 2, 6]`,“坑”位置更新为索引4。 #### 最终状态 - 左右指针相遇,将基准值6入最后一个“坑”位置,此时组变为`[3, 8, 9, 1, 2, 6]`,“坑”位置更新为索引5。 ### 代码示例 以下是使用Python实现快速排序挖坑法: ```python def quick_sort(arr, low, high): if low < high: pi = partition(arr, low, high) quick_sort(arr, low, pi - 1) quick_sort(arr, pi + 1, high) def partition(arr, low, high): pivot = arr[low] left = low right = high while left < right: while left < right and arr[right] >= pivot: right -= 1 arr[left] = arr[right] while left < right and arr[left] <= pivot: left += 1 arr[right] = arr[left] arr[left] = pivot return left # 示例组 arr = [6, 3, 8, 2, 9, 1] quick_sort(arr, 0, len(arr) - 1) print("Sorted array:", arr) ``` 这段代码实现快速排序的挖坑法,其中`partition`函负责将组分成两部分,并返回基准值的最终位置。主函`quick_sort`则递归地对左右子序列进行排序[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值