快速排序C++实现(附完整可运行源代码)

快速排序(Quick sort):

  1. 思想:选一个基准元素,将比该元素小的放在左边,大的放在右边,以此分割,再将分割所得子序列按同样的方式分割,直到原序列有序。
  2. 优缺点:快、数据移动少、但是不稳定
  3. 复杂度:平均时间复杂度:O(nlogn)、最好:O(nlogn)、最坏:O(n^2)
    空间复杂度:最好:O(logn)、 最坏:O(n)
  4. 稳定性:不稳定

源代码

/****************************************
 题目:快速排序。
	编写划分函数:以一个随机的数,
	将数组分为大于该数的右半边和小于该数的左半边
*****************************************/
#include<ctime>		//时间种子
#include<cstdlib>	//随机数rand
#include<iostream>
using namespace std;

int Partition(int[], int, int, int);  //划分函数的声明【把划分函数提到该函数前面,则不用声明】
//快速排序
//参数:
//		data[]:需要划分的数组
//		length:数组的长度
//		begin:需要划分的开始下标
//		end:需要划分的结束下标
void QuickSort(int data[], int length, int begin, int end)
{
    
    
	if (begin == end)
		return;
	int index = Partition(data, length, begin, end);
	if (index > begin)
		QuickSort(data, length, begin, index - 1);
	if (index < end)
		QuickSort(data, length, index + 1, end);
}
//函数功能:取随机数,范围在[begin,end]闭区间内
int RandomInRange(int begin, int end)
{
    
    
	srand((unsigned)time(NULL));
	return ((rand() % (end - begin + 1)) + begin);
	//return (rand() % (end - begin + 1) + 1);
}
//函数功能:交换两数在内存中的位置【不用传递原数据进来,直接传递要交换的两数的地址】
void Swap(int* p1, int* p2)
{
    
    
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
//函数功能:以一个随机的数,将数组分为大于该数的右半边和小于该数的左半边
//参数:
//		data[]:需要划分的数组
//		length:数组的长度
//		begin:需要划分的开始下标
//		end:需要划分的结束下标
int Partition(int data[], int length, int begin, int end)
{
    
    
	//1. 判断,传入参数是否不符合规则,不符合则抛出异常
	if (data == nullptr || length <= 0 || begin < 0 || end >= length)
		throw new exception("Invalid input.");
	
	//2. 随机在范围内取一个下标,指向的数字即为本次划分的分界点
	int index = RandomInRange(begin, end);
	//3. 将分界点数字放在数组的末尾
	Swap(&data[index], &data[end]);
	
	//4. 定义sumallNumsIndex代表比分界点小的数的个数(下标)
	int smallNumsIndex = begin - 1;
	for (index = begin; index < end; index++)
	{
    
    
		//5. 从头开始遍历,判断数是否比分界点小
		if (data[index] < data[end])
		{
    
    
			//6. 如果小,说明找到了第一个在分界点左边的数字,small下标++
			++smallNumsIndex;
			//7. 判断,如果当前下标和小数下标不同步,
			//	说明是隔了几个大数才出现的小数,交换位置,把小数调到前面去
			if (smallNumsIndex != index)
				Swap(&data[smallNumsIndex], &data[index]);
		}
	}
	//8. 最后,再把分界点换到所有小数的右边
	++smallNumsIndex;
	Swap(&data[smallNumsIndex], &data[end]);

	return smallNumsIndex;
}
//简单测试
int main(int argc, char* argv[])
{
    
    
	int nums[] = {
    
     4, 5, 1, 7, 5 };
	QuickSort(nums, 5, 0, 4);
	for (int i = 0; i < 5; i++)
		cout << nums[i] << "  ";

	cout << endl;
	return 0;
}

仍有不足,欢迎交流。

猜你喜欢

转载自blog.csdn.net/qq_43685399/article/details/106697818