排序5:快速排序 (递归)

本文深入解析了快速排序算法,一种高效的交换排序方法,由C.A.R.Hoare在1962年提出。文章详细介绍了算法的基本思想,通过一趟排序将数据分割成独立的两部分,左边都是比分割点小的数,右边都是比分割点大的数,并通过递归对这两部分数据进行排序。此外,还提供了C++代码实现和分析了时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.概述

(1)快速排序是一种交换排序,通过一趟排序将要排序的数据分割成独立的两部分: 分割点边都是比它小的数,右边都是比它大的数。它由C. A. R. Hoare在1962年提出。

二.算法思想

1)通过一趟排序将要排序的数据分割成独立的两部分:分割点边都是比它小的数,右边都是比它大的数 (2)按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

设一组无序的数组:2、4、5、1、3

 

三.代码实现

/*
From:mohican
Date: 2019.1.11
*/

#include<iostream>
#define SIZE 10 
using namespace std;
//快速排序 根据基准元素 来排序
//一趟快速排序过程 ---》与基准进行比较
//递归寻找基准的过程


//寻找基准 一趟快速排序的过程
int Partion(int *arr, int left ,int right)
{
	int L = left ;
	int R = right;
	int par  = 0;
	int base = 0;
	while(L< R)
	{
		base = arr[L];
		//第一步 从右向左扫描  比base小,与left交换
		while ((L< R) && (arr[R]>=base))
		{
			--R;
		}
		if(arr[R] <base)
		{
			arr[L] = arr[R];
		}
		//第二步,从左向右扫面,比base大,与right 交换
		//left == right   返回par;
		while ( (L< R) && (arr[L]<=base))
		{
			++L;
		}
		if(arr[L]>base)
		{
			arr[R]=arr[L];
		}
			arr[L] = base;
	}
	par = L;
	return par;
}

//递归每次找基准   保证左右两边两个数据以上
void Quick(int *arr,int start,int end)
{
	int par = Partion(arr,start,end);
	//如果左边有两个数据以上
	if(par>start+1)
	{
		Quick(arr,start,par-1);
	}
	//如果右边还有两个数据以上
	if(par<end-1)
	{
		Quick(arr,par+1,end);
	}
	return ;
}

void QuickSort(int *arr,int len)
{
	Quick(arr,0,len-1);
}

void Show(int *arr,int len)
{
	for(int i =0;i<len;++i)
	{
		cout<<arr[i]<<"   ";
	}
}

int main()
{
	cout<<"Please input number ! SIZE ="<<SIZE<<endl;
	int *arr= new int[SIZE] ;
    for(int i = 0;i<SIZE;++i)
	{
		cin>>arr[i];
	}
	int len = SIZE;
	QuickSort(arr,len);
	Show(arr,len);
	system("pause");
	return 0;
}

四.时间复杂度 和 空间复杂度

快速排序中:

相同元素可能会因为分区,而进行交换,所以是稳定性最差的排序方法

当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,效率最差; 随机分布时,第一个关键字为基准分两个子序列,两个子序列的元素数接近,效率最好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值