`
provista
  • 浏览: 121866 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

快速排序的随笔

J# 
阅读更多
先上代码吧,以下是结合网上代码修改的一个快速排序的demo.
先来搞个"排序"的虚基类:
public abstract class AbstractSorter<E extends Comparable<E>> {
	
	public abstract void sort(E[] array,int low ,int high);
	
	public final void sort(E[] array)
    {
        sort(array,0,array.length-1);
    }
	/**
        * 互换函数*/
	public final void swap(E[] array, int i, int j){
		E tempE = array[i];
		array[i] = array[j];
		array[j] = tempE;
	}
}

再来一个快速排序的实现继承:
public class QuickSorter<E extends Comparable<E>> extends AbstractSorter<E> {

	public QuickSorter() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public void sort(E[] array, int low, int high) {
		if(low < high){
			int pivot = partition(array, low, high);
			this.sort(array, low, pivot-1);
			this.sort(array, pivot+1, high);
		}

	}

	private int partition(E[] array, int low, int high) {
		E pivotContent = array[high];
		int itrace = low;
		for(int j=low;j<high;++j){
			if(array[j].compareTo(pivotContent)<0){
				swap(array, itrace++, j);
			}
		}
		swap(array, itrace, high);
		return itrace;
	}
}

好吧,其实我之前还不大清楚什么是快速排序的,现在研究了代码,就比较清晰了.
快速排序就是在队列任选一个元素为支点,把支点放入一个位置,这个位置的左侧全是比它小的元素,而右侧全是比它大的元素,即就支点和左右两段来说,队列是已排序的.然后再对左右两段递归进行快速排序,最后就得到了有序队列.
快速排序的关键点就是在于把所选取的支点元素正确放入它本该处于的位置(亦即最后有序时的正确位置).在上述实现中,选取的就是该段数组最大索引的元素为支点.然后从左到右遍历数组,发现大于支点元素的就跳过,发现小于支点元素的就把该元素和"尽可能左方"的untouched的元素对换.所谓untouched,要么就是之前被跳过的元素,即比支点元素大的元素,要么就是被置换过的元素,而必然地,也是比支点元素大的元素.这一切由itrace变量即一个表示置换进度的变量所控制,每发生一次置换,自增一次. 当所有元素已经check过了之后,再把itrace当下位置的元素与最大索引的元素置换.返回itrace,即支点元素的索引,也是最后有序的索引,从而完成了一次排序.接下来就是分别对itrace左右两段各执行上述排序过程~

解释:如上所述,itrace变量是一个表示置换进度的变量,每发生一次置换,自增一次. 实际上,itrace的意义在于,它左方的元素,都是比支点元素小的,因此,当遍历完一次数组时,所有的比支点小的元素已经云集到itrace指示的索引左方;最后,把itrace索引所在的当前元素(肯定是某个比支点大的元素)与支点交换,于是,支点元素就得到了妥善安置,所有左方元素都比它小,所有右方元素都比它大.

最后,提一提快速排序的时间复杂度为O(nlogn),最差情况下(本例选取的支点为最后一个元素则逆序时为最差(未验证))为O(n^2).
测试用main函数如下:
/**
	 * @param args
	 */
	public static void main(String[] args) {
		Integer[] array = {12,15,7,2,8,10};
		AbstractSorter<Integer> sorter = new QuickSorter<Integer>();
		sorter.sort(array);
		
		for(int i = 0;i<array.length;i++){
			System.out.print(array[i].intValue()+" ");
		}
	}
分享到:
评论

相关推荐

    MOSS 2007 应用随笔

    3. **筛选器和排序**:用户可以根据多个字段对结果进行筛选和排序,找到最相关的结果。 4. **搜索中心**:创建一个专门的搜索页面,集中展示搜索选项和结果,提供更高级的搜索功能。 ### 四、搜索结果相关性 提高...

    李建壹 Louis Lee(小路哥 lotus Notes开发随笔.

    视图是Lotus Notes中数据的组织和展示方式,它可以按照多种标准进行排序和分类。开发者可以创建自定义视图,以便快速定位和分析数据。小路哥的随笔可能涵盖如何设计动态视图,实现数据的多维度展示,以及如何利用...

    PyQt(Python+Qt)学习随笔:QAbstractItemView

    它处理了如滚动、选中、排序等操作,并提供了一种方式来定制这些行为以适应不同的视图需求。 **垂直滚动模式(verticalScrollMode)**是QAbstractItemView中控制视图如何处理垂直方向滚动的一种属性。默认情况下,...

    【Java - 框架 - Knife4j】随笔

    - **开发阶段**:在开发过程中,Knife4j可以帮助开发者快速生成API文档,方便团队内部沟通和协作。 - **测试阶段**:测试人员可以直接使用Knife4j的测试功能进行接口验证,减少编写测试脚本的工作量。 - **生产...

    存储随笔《PCIe科普教程》pdf

    事务层位于PCIe协议栈中的第三层,主要负责数据包的封装、解封、排序和传递等工作。它是实现PCIe设备间数据交换的关键部分。 #### TLP(Transaction Layer Packet) TLP是事务层数据传输的基本单位,包含了一系列的...

    基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)

    在本篇随笔中,我们将探讨如何在基于BootStrap的Metronic框架中实现一个页面链接收藏夹功能,并特别关注如何使用Sortable JavaScript组件来实现收藏记录的拖动排序。Metronic是一个强大的响应式前端框架,它结合了...

    blog.zip_文章管理

    博客管理系统是现代网络环境中一种常见的在线内容发布平台,它允许用户创建、编辑和分享各种形式的文字内容,如文章、随笔、日记等。这个“blog.zip_文章管理”压缩包可能包含了一个完整的博客系统或者与文章管理...

    简洁的个人博客网站前台html页面模板

    5. **newlist.html**:这个可能是文章列表页,显示多篇博客文章的摘要,通常按照时间或热度排序,供用户快速浏览和选择感兴趣的文章。 6. **template.html**:这是一个通用模板文件,可能包含了网站的布局结构、...

    MYSQL网络数据库PDF学习资源

    3.8.5 对某个已有的列进行排序 120 3.8.6 非正常次序的串 120 3.8.7 建立计数表 120 3.8.8 检查表是否存在 121 3.9 MySQL 不支持的功能 121 第4章 查询优化 125 4.1 使用索引 125 4.1.1 索引的益处 125 4.1.2 索引的...

    TeamEssay3

    【TeamEssay3】是本次讨论的主题,这可能是一个团队项目或者协作学习的组成部分,而"团队随笔3"则暗示了这是一个系列中的第三个文档,很可能记录了团队在某个IT项目或研究过程中的想法、进展、问题及解决方案。...

    mysql网络数据库指南(中文版) part1

    13.1.5 快速运行myisamchk和 isamchk 332 13.2 安排预防性的维护 333 13.2.1 用cron定期检查表 334 13.2.2 在系统启动期间检查表 335 第四部分 附 录 附录A 获得和安装软件 337 附录B 列类型参考 349 附录C ...

Global site tag (gtag.js) - Google Analytics