快速排序及其C++代码实现

快速排序

1 算法介绍:

快速排序属于“交换类排序”,通过多次划分操作实现排序。接下来以升序为例介绍算法步骤。在一趟选择当前序列中的一个关键字(通常是第一个)作为中间轴,将当前序列中比中间轴小的元素移到中间抽左边,比中间轴大的元素移动到中间轴右边;当本趟结束后,当前序列中以中间轴为基准,被划分为两个子序列,左边子序列的元素都不大于中间轴,二右边的子序列的元素则都不小于中间轴。接下来再将这两个子序列分别重复以上步骤。

2算法执行流程

首先进行第一趟排序;
1.在开始是first,last分别指向序列的头元素和尾元素,以头元素为中间轴,用last开始从右往左开始扫描,直到遇到比中间轴小的元素,此时last指向该元素的下标;然后把该元素挪到first所指的位置上。
2.然后用first开始从左往右扫描,直到遇到比中间轴大的元素,此时first指向该元素的位置,然后将该元素挪到last所值的位置上去。
3.然后继续挪动last指针(即重复1步骤,然后重复2步骤,知道first指针和last指针相遇),这时将中间轴的元素放到该位置上;这样就完成了一趟划分。接下来分别对中间轴两边的两个子序列做同样的划分操作。

3代码实现

void quick_sort(vector<int>&v,int low,int hight)
{
	if(low>hight)
	{
		return;
	}
	
	int first=low,last=hight,key=v[first];
	
	while(first<last)
	{
		while(first<last&&v[last]>=key)
		{
			--last; 
		}
		v[first]=v[last];
		
		while(first<last&&v[first]<=key)
		{
			++first;
		}
		v[last]=v[first];
	}
	v[first]=key;	
	quick_sort(v,low,first-1);
	quick_sort(v,first+1,hight);
}

void printVector(vector<int>&v)
{
	for(auto it=v.begin();it!=v.end();it++)
	cout<<*it<<" ";
}
int main()
{
	vector<int>v={49,38,65,97,76,13,27,49};
	quick_sort(v,0,v.size()-1);
	printVector(v); 
	return 0;
 } 

在这里插入图片描述

4算法性能分析

4.1时间复杂度分析

快速排序最好的情况下的时间复杂度为O(nlog2(n)),待排序的序列越接近无序,本算法的效率越高。最坏的情况下的时间复杂度为O(n^2) ,待排序序列越接近有序本算法效率越低。平均情况下时间复杂度为O(nlog2(n)),快速排序的排序趟数和初始序列有关。

4.2空间复杂度

空间复杂度为O(log2(n)).快速排序是递归进行的,递归需要借助栈的辅助,因此它需要的辅助空间比前面几类排序算法大。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值