数据结构 快速排序(详解)

  快速排序

1:快速排序的思想

    快速排序运用了分治的思想,即通过一趟排序 将序列分为两部分,根据选取的基准, 将比基准小的数放在基准前面,将比基准大的数放在的数放在基准后面;然后对两部分进行递归处理,以达到整个序列有序的状态。

2:快速排序的步骤

   (1):选择基准 在一个待排序列中找一个 待排的数作为基准;

   (2):分割操作 根据基准将序列分为两部分 

   (3):将分割后的序列进行递归操作;

3:选择基准的方法

(1):固定基准:即选取序列的第一个数或最后一个数作为基准;(耗费时间长)

(2):三数取中:即将序列中的首 中 尾 三个数 取出来 进行比较取 中间那个数;

4:运算最快的代码组合之一

    三数取中 + 插排 

#include<stdio.h>void swap(int a, int b){int temp;temp = a;a = b;b = temp;
}//插入排序
void Insertion_sort(int A[], int low, int high){int P,i;                      int N = high - low;for(P = 1; P < N; P++){int temp = A[P];for(i = P; i > 0 && A[i-1] >= temp; i--){A[i] = A[i-1];A[i-1] = temp; }}
}
//选取 一个基准 进行 分成两部分 //使用三数取中法选择枢轴 
//int  getstandard(int A[], int i, int j){
//	
//	int mid = i + ((j - i) >> 1);//计算数组中间的元素的下标
// 
//	//使用三数取中法选择枢轴
//	if (A[mid] > A[j])//目标: arr[mid] <= arr[high]
//	{
//		swap(A[mid],A[j]);
//	}
//	if (A[i] > A[j])//目标: arr[low] <= arr[high]
//	{
//		swap(A[i],A[j]);
//	}
//	if (A[j] > A[i]) //目标: arr[low] >= arr[mid]
//	{
//		swap(A[mid],A[i]);
//	}
//	//此时,arr[mid] <= arr[low] <= arr[high]
//	int key = A[i];
//	//low的位置上保存这三个位置中间的值
//	//分割时可以直接使用low位置的元素作为枢轴,而不用改变分割函数了
//	
//	while(i < j){
//		
//		while(i < j && A[j] >= key){
//			j--;
//		} 
//		if(i < j && A[j] < key){
//			A[i] = A[j];
//		}
//		
//		while(i < j && A[i] <= key){
//			i++;
//		}
//		if(i < j && A[i] > key){ //前面的数如果大于key的话 就将前面的数放到后面?
//			A[j] = A[i];
//		}
//	} 
//	//出这个循环  
//    A[i] = key;
//    return i ;
//}//此为选取第一个 数据作为基准 
int  getstandard(int A[], int left, int right){int i = left,j = right;int key = A[left];//选取 第一个数据为基准while(i < j){while(i < j && A[j] >= key){j--;} while(i < j && A[i] <= key){i++;}//当发现 从右边开始发现有比基准数小的时候,从左边开始 遇到比基准数大的时候//交换两个数 if(i < j){swap(A[i],A[j]);}} //出这个循环  交换基准数  和 i 与 j 相等时那个位置的数 A[left] = A[i];A[i] = key;return i; 
}void QuickSort(int A[] ,int low ,int high){if(low < high){int standard = getstandard(A, low, high);//递归两部分   QuickSort(A, low, standard-1);QuickSort(A, standard+1, high);              }//当数据小于10的时候选择插入排序明显 比 快排速度更快 if(high - low < 10)Insertion_sort(A, low, high);
}
int main(){int i,n;scanf("%d",&n);int a[n];for(i=0; i<n; i++){scanf("%d",&a[i]);}QuickSort(a,0,n-1);for(i=0; i<n; i++){printf("%d ",a[i]);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全年营业额怎么计算_门店盈亏平衡计算及案例分析 | 商品管理

以某门店为例&#xff0c;面积为150平方米。年租金16万元、人员工资费用15万元、水电费3万元&#xff0c;税费1.2万元、装修费2.9万元、交通费1.6万元、投入成本的利息及其他费用3.3万元。(进货折扣)是50%&#xff0c;春夏季销售额占年总销售额的40%&#xff0c;一件春夏季的衣…

人工智能?.NetCore一样胜任!

提起AI&#xff0c;大家都会先想到Python&#xff0c;确实Python作为一门好几十年的老语言&#xff0c;上一波的AI大流行使它焕发了青春。大家用Phtyon来做AI&#xff0c;最主要的原因无非就是编码量更少&#xff0c;很多数学和AI相关的Api都是现成的。但是随着ML.net的问世&am…

创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)

函数参数传递的两种方式为值传递和引用传递 目录 函数参数传递的两种方式为值传递和引用传递 1.传值方式传参 2.引用方式传参 3.通过一段代码运行进一步理解传指针(包括二级指针)和传指针的引用 4.总结 1.传值方式传参 c语言是按值传递的&#xff0c;在函数中被传递的参…

区域转换为二值图像_Matlab图像处理系列教程(一)

小编近期为大家带来一套全面系统的MATLAB在图像处理中的应用。灰度处理 灰度化处理就是将一幅色彩图像转化为灰度图像的过程。彩色图像分为R&#xff0c;G&#xff0c;B三个分量&#xff0c;分别显示出红绿蓝等各种颜色&#xff0c;灰度化就是使彩色的R&#xff0c;G&#xff0…

7.30 KubeCon2020 | 今天下午5:40 近几年最火爆的技术峰会之分享主题.NET开发者与Kuberentes...

01最负盛名的峰会自2018 年 KubeConCloudNativeCon 首次落地中国以来&#xff0c;CNCF 每年都会在中国举办云原生技术大会。大会每年都能吸引来自五大洲 48 个国家的开源精英和技术大咖前来参会。阿里、华为、腾讯等你所知道的每一家大厂都是KubeCon的大会赞助商。滑动查看更多…

[MyBatisPlus]测试BaseMapper的功能测试自定义功能

测试BaseMapper的功能 添加功能 /*** 实现新增用户信息*/Testpublic void testInsert(){User user new User();user.setName("张三");user.setAge(23);user.setEmail("zhangsanxx.com");int result userMapper.insert(user);System.out.println("r…

利用数组模拟队列和栈(详解)

利用数组模拟队列和栈 目录 利用数组模拟队列和栈 1&#xff1a;使用要领 2:具体代码 3&#xff1a;C栈和队列的链接 1&#xff1a;使用要领 在C语言中如果要用到了队列和栈 但又不想 写队列和栈的方法 &#xff0c;可已使用数组模拟队列和栈&#xff1b;但如果使用C便可以…

[MyBatisPlus]通用Service接口测试通用Service

通用Service接口 说明: 通用 Service CRUD 封装IService接口&#xff0c;进一步封装 CRUD 采用 get 查询单行 remove 删 除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆&#xff0c;泛型 T 为任意实体对象建议如果存在自定义通用 Service 方法的可能&#x…

windows 禁用ipv6服务_在 Windows 7 中禁用IPv6协议/IPv6隧道

How to disable certain Internet Protocol version 6 (IPv6) components in Windows Vista, Windows 7 and Windows Server 2008http://support.microsoft.com/kb/929852/HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\双击 DisabledComponents 来…

程序员修神之路--晦涩难懂的CAP,是否完全正确?

微信搜一搜架构师修行之路菜菜哥&#xff0c;帮忙解决一个问题是不是面试又被虐了&#xff1f;是的呢&#xff0c;这次面试官问我什么是CAP&#xff1f;这个可就说来话长了......01PARTCAP说到CAP&#xff0c;首先不能不说分布式系统&#xff0c;前面几篇也说过&#xff0c;分布…

7-4 是否同一棵二叉搜索树 (25 分)

是否同一棵二叉搜索树 1.题目描述&#xff1a; 给定一个插入序列就可以唯一确定一棵二叉搜索树。然而&#xff0c;一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树&#xff0c;都得到一样的结果。于是对…

[MyBatisPlus]雪花算法

雪花算法 背景 需要选择合适的方案去应对数据规模的增长&#xff0c;以应对逐渐增长的访问压力和数据量。 数据库的扩展方式主要包括&#xff1a;业务分库、主从复制&#xff0c;数据库分表。 数据库分表 将不同业务数据分散存储到不同的数据库服务器&#xff0c;能够支撑…

pip 设置超时时间_Python pip使用超时问题解决方案

引言之前有位群友在群里发了个问题&#xff0c;说使用pip安装第三方包遇到"Read timeout"。我相信很多时候&#xff0c;大家在使用pip都会遇到这个问题&#xff0c;所以&#xff0c;我想有必要写一遍文章来总结一下。具体如下&#xff1a;解决方案在这之前&#xff0…

如何隐藏运行 winform 程序?

群里有个同学问了问题 如何隐藏运行 winform 程序&#xff1f;&#xff0c;提起了我的兴趣&#xff0c;玩玩呗&#xff1f;那就玩玩吧&#xff01;第一版 将一个 winform 程序隐藏执行&#xff0c;隐藏执行的方式有很多种&#xff0c;第一个 demo 就用最简单的方式&#xff0c;…

vector的基本用法 (详解 + 代码演示)

前言&#xff1a; vector 是向量类型&#xff0c;它可以容纳许多类型的数据&#xff0c;如若干个整数&#xff0c;所以称其为容器。vector 是C STL的一个重要成员&#xff0c;使用它时需要包含头文件&#xff1a;#include; 一、vector 的初始化&#xff1a;可以有五种方式,举…

python定义一个_Python,包括定义一个类

我有一个我要解决的问题&#xff1a;编写一个包含以下内容的类contentResult的定义&#xff1a;•String类型的实例变量winner&#xff0c;初始化为空字符串。在•String类型的实例变量second_place&#xff0c;初始化为空字符串。在•字符串类型的第三位实例变量&#xff0c;初…

[MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略

常用注解 TableName 设置实体类所对应的表名 如果全部表都有某个前缀,难道我们要通过一个一个加注解的方式来解决实体类对应表名问题吗&#xff1f; 我们可以通过配置文件来解决这个问题&#xff1a; TableId 将属性所对应的字段指定为主键 TableId的value属性 TableId的ty…

最小堆和最大堆的建立以及基本操作

前言&#xff1a; 堆的特性&#xff1a;用数组表示的完全二叉树。有序性&#xff1a;任一结点的关键字是其子树所有结点的最大值 (最小值) 堆的本质&#xff1a;就是一颗 完全二叉树 堆的数据存储&#xff1a; 用的是 数组 建堆时主要的操作&#xff1a;就是调整 对数组的元素…

[C#.NET 拾遗补漏]06:单例模式最佳实践

阅读本文大概需要 3 分钟。大家好&#xff0c;这是【C#.NET 拾遗补漏】专辑的第 06 篇文章。今天讲讲大家熟悉的单例模式。单例模式大概是所有设计模式中最简单的一种&#xff0c;如果在面试时被问及熟悉哪些设计模式&#xff0c;你可能第一个答的就是单例模式。单例模式的实现…

字符串是单一字符的无序组合吗_Python学习笔记(八)组合数据类型

Python语言中最常用的组合数据类型有3大类&#xff0c; 分别是集合类型、序列类型和映射类型。集合类型是一个具体的数据类型名称&#xff0c;而序列类型和映射类型是一类数据类型的总称。集合类型是一个元素集合&#xff0c;元素之间无序&#xff0c;相同元素在 集合中唯一存在…