0
点赞
收藏
分享

微信扫一扫

快速排序的三种写法

胡桑_b06e 2022-03-30 阅读 53

一. 单向扫描分区法

void quickSort1(int arr[],int L,int R)
{
	if (L > R)return;
	int pivot = arr[L];
	int left = L;
	int right = R;
	while (left <= right)
	{
		if (arr[left] <= pivot)
		{
			left++;
		}
		else
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
			right--;
		}
	}
	int tmp = arr[L];
	arr[L] = arr[right];
	arr[right] = tmp;
	quickSort1(arr, L, right - 1);
	quickSort1(arr, right + 1, R);
}

二.双向扫描分区法

双向扫描分区法
void quickSort2(int arr[], int L, int R)
{
	if (L > R)return;
	int pivot = arr[L];
	int left = L;
	int right = R;
	while (left <= right)
	{
		while (left <= right && arr[left] <= pivot)
		{
			left++;
		}
		while (left <= right && arr[right] >= pivot)
		{
			right--;
		}
		if (left <= right)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
	int tmp = arr[L];
	arr[L] = arr[right];
	arr[right] = tmp;
	quickSort2(arr, L, right - 1);
	quickSort2(arr, right + 1, R);
}

三. 三分法(适用于重复比较多的情况下)

//三指针分区法
void quickSort3(int arr[], int L, int R)
{
	if (L > R)return;
	int pivot = arr[L];
	int left = L+1;
	int right = R;
	int equal = left;
	while (left <= right)
	{
		if (arr[left] < pivot)
		{
			int tmp = arr[left];
			arr[left] = arr[equal];
			arr[equal] = tmp;
			left++;
			equal++;
		}
		else if (arr[left] == pivot)
		{
			left++;
		}
		else if (arr[left] > pivot)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
			right--;
		}
	}
	int tmp = arr[L];
	arr[L] = arr[equal - 1];
	arr[equal - 1] = tmp;
	quickSort3(arr, L, equal - 2);
	quickSort3(arr, right + 1, R);
}
举报

相关推荐

0 条评论