博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记之高速排序
阅读量:6201 次
发布时间:2019-06-21

本文共 1650 字,大约阅读时间需要 5 分钟。

1.1 算法思路——

该算法在数组中选定一个元素作为主元(一般选第一个),然后以这个主元为參考对象将数组分为两个部分,第一部分都是小于或者等于主元,第二部分都是大于或者等于主元。

然后对第一和第二部分递归地使用高速排序算法,直到分到最小的小组为止。

1.2 时间复杂度——

在最差的情况下,要把n个元素的数组划分,须要n次比較和n次移动。如果用T(n) 来表示使用高速排序算法来排序n个元素的数组所耗费的时间。那么

 Tn = T(n/2)+ T(n/2) +2n

所以,高速排序的时间复杂度应该是  Tn =O(nlogn)

1.3 程序流程图

1.4 实现代码

package lin.algo;public class QuickSort {	int[] list;	public QuickSort(int[] list){		this.list = list;	}		public int[] quickSort(){		quick(list,0,list.length-1);		return list;	}		private void quick(int[] list,int first , int last){		if (last>first) {			int pivoxIndex = partition(list, first, last);			quick(list, first, pivoxIndex-1);			quick(list, pivoxIndex+1, last);		}	}		/**	 * 依据第一个元素来划分数组	 * 输入的是要划分的原始数组。第一个元素下标和最后一个元素下标	 * @param list	 * @param first	 * @param last	 * @return 分组后的主元下标	 */	private int partition(int[] list,int first , int last){		//主元		int privot = list[first];		int secondIndex = first+1;		int lastIndex = last;				//遍历查询,大于主元的在右边。小于的在左边		//实现方法:两边查起,将左边大于主元的与右边小于主元的交换,		//最后把主元放在两个分好组的中间位置		while(lastIndex>secondIndex){			//寻找左边第一个比主元大的			while(secondIndex<= lastIndex  &&list[secondIndex]<=privot ){				secondIndex++;			}						//寻找右边第一个比主元小的			while( secondIndex<= lastIndex  && list[lastIndex]> privot){				lastIndex--;			}						//至此。假设还没检查完序列,就证明分别找到了。交换			if (secondIndex< lastIndex) {				int temp = list[secondIndex];				list[secondIndex] = list[lastIndex];				list[lastIndex] = temp;			}		}				while(list[lastIndex] >= privot && lastIndex> first){			lastIndex --;		}				//返回主元新下标		if (privot > list[lastIndex]) {			list[first] = list[lastIndex];			list[lastIndex] = privot;			return lastIndex;		}else {			return first;		}			}}
你可能感兴趣的文章
光纤接口类型及光纤收发器指示灯图解
查看>>
static
查看>>
[NOIP2010]乌龟棋(DP)
查看>>
springmvc json乱码问题
查看>>
企业分布式微服务云SpringCloud SpringBoot mybatis (六)分布式配置中心(Spring Cloud Config)...
查看>>
逻辑回归
查看>>
linux下redis安装
查看>>
virtualbox安装centos 6.4 server 网络连接问题
查看>>
C#多线程编程
查看>>
一个人在咖啡里默默的打总结。
查看>>
IDEA常用插件及下载地址
查看>>
数字三角形
查看>>
PasswordHelper 对user对象的password进行加密重设
查看>>
struct tm的定义
查看>>
Redis 数据类型
查看>>
持续集成(CONTINUOUS INTEGRATION)
查看>>
Inno Setup入门(六)——在程序目录下创建文件
查看>>
centos 6.5 中设置mysql 5.1.73 主从同步配置过程
查看>>
关于 Sublime Text 2
查看>>
微信小程序开发学习记录
查看>>