快速排序 (挖坑法)

快速排序的排列方式

– 实现方法

有大概两种方法:
1.左右指针法
2.挖坑法

首先对于左右指针法,想了解的朋友,可以去看我的另一篇链接: 左右指针法。
接下来的就是挖坑法

挖坑法的基本思路

  • 其挖坑法思路和左右指针法的思路相似:

1.选出一个数据(一般是最左边或是最右边的)存放在key变量中,在该数据位置形成一个坑。
2、还是定义一个left和一个right,L从左向右走,R从右向左走。(若在最左边挖坑,则需要R先走;若在最右边挖坑,则需要L先走)

后面的思路与(左右指针法)思路类似在此处就不说了:
看图解:

假如要排序一串数组:
——
快速排序 (挖坑法)_第1张图片

假如找出的是左边第一位放入key变量中,留下一个坑位:
快速排序 (挖坑法)_第2张图片

然后有right,和left所指的位置:
快速排序 (挖坑法)_第3张图片

开始移动,right先向左边进行一步一步寻找,直到找到比key小的数;
快速排序 (挖坑法)_第4张图片

然后让right找到的数值填入这个坑中:

快速排序 (挖坑法)_第5张图片

  • 然后是left开始向右一步一步寻找到比key大的数停止,然后在让其填入right所指的坑中:
    快速排序 (挖坑法)_第6张图片

然后就是重复以上的操作,直到right和left相遇,让key的值填入这个坑中。

快速排序 (挖坑法)_第7张图片

在这个时候 3 则是已经填入正确是位置,然后一部将3左边和右边分看成两个数组;
先看3左边的数组:
快速排序 (挖坑法)_第8张图片

接下来也是和刚才一样的顺序:
找到左边第一位,放入key变量中,这时right向左移动一步,然后让left和right相遇,key再次填入这个坑中:
然而将1放入正确的位置后还剩一个数值,则这个数值就是在正确是位置;

注意:直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,代表此时此部分已有序。

再次看向3右边的数值:
在这里插入图片描述
与之一样的操纵:
快速排序 (挖坑法)_第9张图片

进行第一次填坑:

快速排序 (挖坑法)_第10张图片

  • left找到大于key的数值,填入坑内:

快速排序 (挖坑法)_第11张图片
然后right向左移动,会再次与left相遇,将key填入坑内:
在这里插入图片描述
这时是将6放入了正确的位置:
再次将6的左边和右边看成两个数组,进行排序:
与上述一样的步骤:
在最后将数组排序好;
快速排序 (挖坑法)_第12张图片
代码的实现:

void QuickSort(int *arr,int begin,int end)
{
	if (begin >= end)
		return;
	int left = begin;
	int right = end;
	int key = arr[begin];

	while (begin < end)
	{
		//找小
		while (arr[end] >= key && begin < end)
		{
			--end;
		}
		//小的放到左边的坑里
		arr[begin] = arr[end];
		//找大
		while (arr[begin]<=key && begin<end)
		{
			++begin;
		}
		//大的放到右边的坑里
		arr[end] = arr[begin];

	}
	//将key填入坑中
	arr[begin] = key;
	int keyi = begin;

	QuickSort(arr, left, keyi - 1);
	QuickSort(arr, keyi + 1, right);
}

int main()
{
	int arr[8] = { 3,2,4,6,5,7,9,1 };

	int left = 0;
	int right = 7;

	QuickSort(arr, left,right);


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

	return 0;
}

——
最后感谢所有观看的朋友们:^ _ ^

你可能感兴趣的:(算法,数据结构)