C++ 八大排序之一-----快速排序

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 八大排序之一-----快速排序相关的知识,希望对你有一定的参考价值。


一、解析问题

  • 快排的思想也是分而治之,但并不需要合并,只是交换
  • 实现快速排算法序的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择数字小的数字移到数组的左边,比选择数字大的数字移动到数组右边。
  • 这个函数可以如下实现。
int Partition(int data[], int length, int start, int end)
{
	if (data == nullptr || length <= 0 || start < 0 || end >= length)
	{
		throw new exception("Invalid Parameters");
	}
	int index = RandomInRange(start, end);
	Swap(&data[index], &data[end]);

	int small = start - 1;
	for (index = start; index < end; ++index)
	{
		if (data[index] < data[end])
		{
			++small;
			if (small != index)
			{
				Swap(&data[index], &data[small]);
			}
		}
	}

	++small;
	Swap(&data[small], &data[end]);

	return small;
}

  • 函数RandomInRange用来生成一个在start和end之间的随机数,函数Swap的作用是用来交换两个数字。
  • 接下来我们可以用递归的思路分别对每次选中的数字的左右两边排序。
  • 下面就是递归实现快速排序的参考代码:
void QuickSort(int data[], int length, int start, int end)
{
	if (start == end)
	{
		return;
	}

	int index = Partition(data, length, start, end);
	if (index > start)
	{
		QuickSort(data, length, start, index - 1);
	}
	if (index < end)
	{
		QuickSort(data, length, index + 1, end);
	}
}

  • 对于一个长度为n的数组排序,只需要把start设为0,把end设置为n-1,调用QuickSort即可
int main(void)
{
	int data[] = { 1,5,4,8,7,4,2,6,9,3 };
	int length = (sizeof(data) / 4);
	int start = 0, end = length - 1;
	QuickSort(data, length, start, end);
	for (int i = 0; i < length; ++i)
	{
		cout << data[i] << " ";
	}
	return 0;
}

二,测试用例

// 快速排序.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

int RandomInRange(int start, int end)
{
	return rand() % (end - start + 1) + start;
}

void Swap(int* num1, int* num2)
{
	int temp;
	temp = *num1;
	*num1 = *num2;
	*num2 = temp;
}

int Partition(int data[], int length, int start, int end)
{
	if (data == nullptr || length <= 0 || start < 0 || end >= length)
	{
		throw new exception("Invalid Parameters");
	}
	int index = RandomInRange(start, end);
	Swap(&data[index], &data[end]);

	int small = start - 1;
	for (index = start; index < end; ++index)
	{
		if (data[index] < data[end])
		{
			++small;
			if (small != index)
			{
				Swap(&data[index], &data[small]);
			}
		}
	}

	++small;
	Swap(&data[small], &data[end]);

	return small;
}

void QuickSort(int data[], int length, int start, int end)
{
	if (start == end)
	{
		return;
	}

	int index = Partition(data, length, start, end);
	if (index > start)
	{
		QuickSort(data, length, start, index - 1);
	}
	if (index < end)
	{
		QuickSort(data, length, index + 1, end);
	}
}

int main(void)
{
	int data[] = { 1,5,4,8,7,4,2,6,9,3 };
	int length = (sizeof(data) / 4);
	int start = 0, end = length - 1;
	QuickSort(data, length, start, end);
	for (int i = 0; i < length; ++i)
	{
		cout << data[i] << " ";
	}
	return 0;
}

三,下一个冒泡排序

以上是关于C++ 八大排序之一-----快速排序的主要内容,如果未能解决你的问题,请参考以下文章

《糊涂算法》之八大排序——快速排序

八大排序算法总结

20191209-八大排序之快速排序

八大种必知排序算法 冒泡排序快速排序 (续)

八大排序算法之一直接插入排序

八大排序 (万字总结)(详细解析,建议收藏!!!)