快速排序优化

优化点:
优化选取中轴元素

以上代码target 选取的位置是认定了数组元素的首位,但是若这个数值的大小不在整个数组的中间位置,会大大降低快排的性能。
target =array[low] 这句就成了一个潜在的性能瓶颈。因此快速排序的速度还取决于这个target关键元素在数组中的位置。 【改进方法】
三数取中法:去三个元素先进行排序,将中间数作为中轴元素,下面的代码选取数组的左、中、右三个数;

#include <iostream>
using namespace std;
void Swap(int &x,int &y)
{
	int temp = x;
	x = y;
	y = temp;

}

int partition(int * arr,int low,int high)
{
	int mid = (low+high)/2;  //取中间数下标
	if(arr[high] < arr[low])
	{
		Swap(arr[low],arr[high]);
	}
	if(arr[high]<arr[mid])
	{
		Swap(arr[mid],arr[high]);
		
	}
	//前2个if保证最后一个数是最大的
	//这个if是保证第一个数的值是三个数中第二大的
	if(arr[mid]>arr[low])
	{
		Swap(arr[low],arr[mid]);
	}
	
	//选好后就正常些快速排序了
	int pv = arr[low];
	while(low<high)
	{
		while(low<high&&arr[high] >=pv)
		{
			high--;
		}
		Swap(arr[low],arr[high]);
		while(low<high&&arr[low] <=pv)
		{
			low++;
		}
		Swap(arr[low],arr[high]);

	}

	return low;






}



void Quick_Sort(int * arr,int low,int high)
{
	if(low<high)
	{
		int pv = partition(arr,low,high);
		Quick_Sort(arr,low,pv-1);
		Quick_Sort(arr,pv+1,high);
	}



}


int  main()
{

	int arr[10];
	
	Quick_Sort(arr,0,9);
	
	for(int i = 0;i<10;i++)
	{
		arr[i] = rand();
	}
	for(int i = 0;i<10;i++)
	{
		cout<<arr[i]<<endl;
	}


	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值