0
点赞
收藏
分享

微信扫一扫

【玩转八大排序③】递归版快速排序(Hoare法、挖坑法、前后指针法)

witmy 2022-05-04 阅读 34

学习导航

一、快排思想介绍

二、Hoare法介绍

 所谓“移动”就是如下过程:

②疑难解答
③代码呈现
int PartSort(int* arr, int left, int right)               
{
	int key = arr[left];
	int keyi = left;
	while (left < right)									//(1)
	{
		while (left < right && arr[right] >= key)           //(2)
			right--;
		while (left < right && arr[left] <= key)
			left++;
		swap(&arr[left], &arr[right]);					    //(3)
	}
	swap(&arr[keyi], &arr[right]);				            
	return right;                                           //(4)
}

void QuickSort(int* arr, int left, int right)
{
	if (left >= right)
		return;
	int keyi = PartSort(arr, left, right);         			//(4)
	QuickSort(arr, left, keyi - 1);
	QuickSort(arr, keyi + 1, right);
}

三、挖坑法介绍

③代码呈现
int PartSort(int* arr, int left, int right)
{
	int hole = left;                                    //(1)
	int key = arr[left];								

	while (left < right)
	{
		while (left < right && arr[right] >= key)
			right--;
		
		arr[hole] = arr[right];
		hole = right;								    //(2)

		while (left < right && arr[left] <= key)
			left++;
		
		arr[hole] = arr[left];
		hole = left;
	}
	arr[hole] = key;                                    //(3)
	return hole;
}

void QuickSort(int* arr, int left, int right)
{
	if (left >= right)
		return;
	int keyi = PartSort(arr, left, right);
	QuickSort(arr, left, keyi - 1);
	QuickSort(arr, keyi + 1, right);
}
④代码剖析

四、前后指针法介绍

②代码呈现
int PartSort(int* arr, int left, int right)
{
	int pre = left;                                   //(1)
	for (int cur = left + 1; cur <= right; cur++)
	{
		if (arr[cur] < arr[left])
			swap(&arr[cur], &arr[++pre]);             //(2)
	}
	swap(&arr[pre], &arr[left]);                      //(3)
	return pre;
}
void Quicksort(int* arr, int left, int right)
{
	if (left >= right)
		return;
	int keyi = Partsort1(arr, left, right);
	Quicksort(arr, left, keyi - 1);
	Quicksort(arr, keyi + 1, right);
}

五、对快排的优化

①key值的取法

下面展示三数取中的代码:

int GetmidIndex(int* arr, int left, int right)
{
	int mid = left + ((right - left) >> 1);
	if (arr[left] <= arr[right])
	{
		if (arr[mid] < arr[left])
			return left;
		else if (arr[mid] > arr[right])
			return right;
		else
			return mid;
	}
	else
	{
		if (arr[mid] > arr[left])
			return left;
		else if (arr[mid] < arr[right])
			return right;
		else
			return mid;
	}
}
②规模较小时的优化
举报

相关推荐

八大排序-快速排序

八大排序——希尔排序

0 条评论