一秒教会你快速排序

快速排序

快速排序是对冒泡排序的一种改进,它的基本思想在于划分,首先在序列中任选一个元素a(i),使其作为划分标准,通过交换,使得a(i)前边(左边)的元素都比a(i)小,而a(i)后边(右边)的元素都比a(i)大,

思路参考图

在这里插入图片描述
对快速排序的基本过程有了基本了解后,下图描述了每次划分时所进行的具体操作
在这里插入图片描述
快速排序通过对序列的不断划分,把原始序列以划分元素为界形成两个子序列,再对子序列重复划分过程,这显然是一个递归过程,递归的中止条件是子序列中只含有一个元素,
在每次划分的过程中,需要设置前后两个指针,这两个指针依次往序列中间位置移动,当指针重合时,结束本次划分,

看代码

#include <iostream>
using namespace std;

// 交换操作
void swap(int arr[], int low, int high)
{
	int temp = arr[low];
	arr[low] = arr[high];
	arr[high] = temp;
}

//计算基准点的函数
//把将所有小于基准点的所有元素放在基准点的左边
//把将所有大于基准点的所有元素放在基准点的右边
int Partition(int arr[], int low, int high)
{
	int point = arr[low];	//基准点定位第一个元素

	while (low < high)	//当退出这个循环时,low和high接触在一块 
	{
		while (low < high && arr[high] >= point)
		{
			high--;
		}
		//比较右边,如果比基准点少,把基准点传过去,把小的数传进来 
		swap(arr, low, high);
		while (low < high && arr[low] <= point)
		{
			low++;
		}
		swap(arr, low, high);
	}

	return low;
}

void Qsort(int arr[], int low, int high)
{
	int point;
	
    //左边的指针和右边的指针都会移动,当指针重叠的时候,进行一轮比较了 
	if (low < high)
	{
		point = Partition(arr, low, high);
		Qsort(arr, low, point-1);
		Qsort(arr, point+1, high);
	}
}

void QuickSort(int arr[], int len)
{
	//参数:数组,初始位置,最大元素的位置
	Qsort(arr, 0, len-1);
}

int main()
{
	int arr1[10]= {8, 5, 2, 6, 0, 3, 9, 1, 7, 4};

	QuickSort(arr1, 10);

	cout<<"快速排序后:"<<endl;
	for (int i = 1; i < 10; i++)
	{
		cout<<arr1[i]<<" ";
	}
	cout<<endl;

	system("pause");
	return 0;
}

对快排partirion()优化

优化方案一(选取更好的基准点)

通过选取更好的基准点来降低递归的深度,以此来优化算法

//优化方案1,
int Partition(int arr[], int low, int high)
{

	int mid = (low +high)/2;

	if (arr[low]>arr[high])
	{
		swap(arr, low, high);
	}
	if (arr[mid]>arr[high])
	{
		swap(arr, mid, high);
	}
	if (arr[low]<arr[mid])
	{
		swap(arr, low, mid);
	}

	int point = arr[low];

	while (low<high)
	{
		while (low<high && arr[high]>=point)
		{
			high--;
		}
		swap(arr, low, high);
		while (low<high && arr[low]<=point)
		{
			low++;
		}
		swap(arr, low, high);
	}

	return low;
}

优化方案二(减少不必要的交换)

//优化方案2,
int Partition(int arr[], int low, int high)
{
	int point = arr[low];

	while (low<high)
	{
		while (low<high && arr[high]>=point)
		{
			high--;
		}
		//swap(arr, low, high);
		arr[low] = arr[high];
		while (low<high && arr[low]<=point)
		{
			low++;
		}
		//swap(arr, low, high);
		arr[high] = arr[low];
	}
	arr[low] = point;

	return low;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值