快速排序的几种写法与改进

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

近乎有序与大量重复情况的优化,避免形成o(n^2)

#include<iostream>
#include<algorithm>
using namespace std;


//快排最坏(比如近乎有序时(想原理图)会退化为n^2,故取随机值造成无序) 
 
template<typename T>
void partition(T arr[],int l,int r)
{
  swap(arr[l],arr[rand()%(r-l+1)+l];//l~r左闭右闭随机取值,高概率复杂度低 随机化快排 
	T v=arr[l];   //仍然是开头的位置,只不过不是高度有序性的开头那个了 
	int j=l;
	for(int k=l+1;k<=r;k++)
	{
		if(arr[i]<v)
		{
		swap(arr[j+1],arr[i]);
		j++;
	   }
	}
	swap(arr[l],arr[j]);
	return j;
}



//双路快排主要是避免重复值造成的n^2 
template<typename T>
void partition(T arr[],int l,int r)
{
  swap(arr[l],arr[rand()%(r-l+1)+l];
	T v=arr[l];   
int i=l+1;j=r;
while(true)
{
	while(i <= r && v > arr[i] ) i++;
	while(r >= l + 1 && v < arr[j]) j--;
	if(i > j) break;//j--后所处的位置还未判断,但是i可以,并且还i++ 
    swap(arr[i],arr[j]);
	i++;
	j--; 
}
swap(arr[l],arr[i]);
return i;
}

template<typename T>
void __quickSort(T arr[],int l,int r)
{
//	if(l>=r)
//	return;
    if(r-l<=15)
	{
		insertionSort(arr,l,r);   //已写好的插入排序优化 
		return;
		}	
	int p=partition(arr,l,r)
	__quickSort(l,p-1);
	__quickSort(p+1,r);
}







template<typename T>
void partition(T arr[],int l,int r)
{
	T v=arr[l];
	int j=l
	for(int i=l+1;i<=r;i++)
	{
		if(arr[i]<v)
		{
			swap(arr[j+1],arr[i]);
			j++;
		}
	}
	swap(arr[j],v);
	return j;
}

template<typename T>
void __quicksort(T arr[],int l,int r)
{
	if(l>=r)
	return;
	
	int p=partition(arr,l,r);
	
	__quicksort(l,p-1);
	__quicksort(p+1,r);
}

template<typename T>
 void quickSort(T arr[],int n)
 {
 	__quickSort(0,n-1);
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值