分治思想:快速排序

快速排序思想:

设k=a[0](取基准元素),将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k的右边,和k相等的,在k的左右均可。然后再把k的左边的元素和右边的元素按照同样的方式进行排序。

时间复杂度:n*logn

空间复杂度:1

和归并排序比较,快速排序比归并排序更加节省空间,但是快速排序的稳定性要比归并排序差。

这里快排的代码没有对基准元素进行优化,属于最原始的快排代码。在快排的单数组比较的代码中,给了2种对比的方式。

代码:

#include <iostream>
using namespace std;
void QuickSort(int arr[], int left, int right);//快排1
void QuickSort2(int arr[], int left, int right);//快排2
void swap(int& a, int& b);

int main()
{
	int arr[] = { 15,6,11,7,5,99,22,3,2,67,45,12,23,1,43,55,0,8,17,58 };//初始待排序数组
	int size = sizeof(arr) / sizeof(int);
	int left = 0, right = size - 1;

	QuickSort(arr, left, right);

	for (int i = 0; i < size; i++)//输出arr数组
		cout << arr[i] << " ";
	return 0;
}

void QuickSort(int arr[], int left, int right)
{
	if (left < right)//这个部分的条件判断与归并排序相同0
	{
		int key = arr[left];
		int i = 0 + left;//指向key位置的指针
		int j = 1 + left;//指向进行判断的数字的位置

		while (j<=right)
		{
			if (key > arr[j] && j - i > 1)//前提是i-j>1
			{
				swap(arr[j],arr[i+1]);//当前i所指的数与key后一个数进行替换
				swap(arr[i],arr[i+1]);//key的位置与key后一个数进行替换
				i++;
				j++;
			}
			else if (key > arr[j])
			{
				swap(arr[i], arr[j]);
				i++;
				j++;
			}
			else
				j++;
		}
		QuickSort(arr, left, i-1);
		QuickSort(arr, i+1,right);
	}
}

void swap(int& a, int& b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}

void QuickSort2(int arr[], int left, int right)
{
	if (left >= right)
		return;

	int key = arr[left];
	int i = left;//指向key位置的指针
	int j = right;//指向进行判断的数字的位置

	while (i!=j)
	{
		if (key < arr[j])
			j--;
		else
		{
			swap(arr[i + 1], arr[j]);
			swap(arr[i], arr[i + 1]);
			i++;
		}
	}

	QuickSort2(arr, left, i-1);
	QuickSort2(arr, i+1, right);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值