数据结构之快速排序

  快速排序的基本思想是: 通过一趟排序将待排的记录划分为独立的两部分,称为前半区和后半区,其中,前半区中记录的关键字均不大于后半区记录的关键字,然后再分别对这两部分记录继续进行快速排序,从而使整个序列有序。

  一趟快速排序的过程称为一次划分,具体做法是:附设两个位置指示变量i 和j,它们的初值分别指向序列的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键字为pivot,则首先从 j 所指位置起向前搜索,找到第一个关键字小于 pivot 的记录时将该记录向前移到 i 指示的位置,然后从i 所指位置起向后搜索,找到第一个关键字大于 pivot 的记录时将该记录向后移到 j 所指位置,重复该过程直至 i 与 j 相等为止。

  【函数】快速排序过程中的划分。

java 复制代码
int partition(int data[], int low, int high)
/*用data[low]作为枢轴元素 pivot 进行划分*/
/*使得 data[low..i-l]均不大于 pivot,data[i+l..high]均不小于 pivot*)
{
	int i, j;int pivot;
	pivot = data[low]; i=low; j=high;
	while(i <j){									/*从数组的两端交替地向中间扫描*/
		while(i <j&& data[j] >= pivot) j--;
			data[i] = data[j];						/*比枢轴元素小者往前移*/
			while (i <j && data[i] <= pivot) i++;
			data[j] = data[i];						/*比枢轴元素大者向后移*/
	}
	data[i] = pivot;
	return i;
}

  【函数】用快速排序方法对整型数组进行非递减排序。

java 复制代码
void quickSort(int data[], int low, int high)
/*用快速排序方法对数组元素 data[low..high]作非递减排序*
{
	if(low < high){
		int loc = partition(data, low, high);		/*进行划分*/
		quicksort(data, low, loc-1):					/*对前半区进行快速排序*/
		quicksort(data, loc+1, high);					/*对后半区进行快速排序*/
	}
}/* quickSort */

  快速排序算法的时间复杂度为 O(nlog2n),在所有算法复杂度为此数量级的排序方法中,快速排序被认为是平均性能最好的一种。但是,若初始记录序列按关键字有序或基本有序时,即每次划分都是将序列划分为某一半序列的长度为0 的情况,此时快速排序的性能退化为时间复杂度是 O(n2)。快速排序是不稳定的排序方法。

相关推荐
Rain的Java大神之路3 分钟前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程
垆边人似月.24 分钟前
华为机试题 :最大数
c++·算法·华为
高级程序源25 分钟前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
IT研究室32 分钟前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
denlaku35 分钟前
JDK 13 新特性详解
java·开发语言
秋饼35 分钟前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
今年下半年44 分钟前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放
念越1 小时前
题库、练习与错题本代码阅读
开发语言·数据结构
WeiXin_DZbishe1 小时前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计
zhenaibo5211 小时前
如何与导师有效沟通选题?
算法