C语言——快速排序(挖坑法)

挖坑法

其思想和hoare的思想基本一致,我们只是把基准值的值放在key里面,然后基准值所在的位置就视为空坑,然后还是一样的寻找方法,找到之后不进行交换,而是直接赋值,就是填坑,然后全部遍历完之后,用key的值来填补最后一坑。

原理图示:

C语言——快速排序(挖坑法)_第1张图片

代码实现:

// 挖坑法 

int PartSort2(int* arr, int left, int right)
{
	int end = right;
	int key;
	int mid = GetIndexMid(arr, left, right);

	if (mid != end)
	{
		int temp = arr[mid];
		arr[mid] = arr[end];
		arr[end] = temp;
	}

	key = arr[right];

	while (left < right)
	{
		//找的比基准值大的值

		while (left < right && arr[left] <= key)
			left++;

		//用left的值来填right的坑
		//left就是一个新坑

		if (left < right)
			arr[right--] = arr[left];

		//找到比基准值小的值

		while (left < right && arr[right] >= key)
			right--;

		//用right的值来填left的坑
		//right又是一个新坑

		if (left < right)
			arr[left++] = arr[right];
	}

	//基准值来填最后的坑

	arr[left] = key;
	return left;
}

你可能感兴趣的:(c,排序,数据结构)