排序算法之一 快速排序

  一次偶然的编程需要写一个排序算法,搜了几篇博客感觉说的很是繁琐,所以想自己写一个试试看,各位读者有什么意见和建议都可以给我留言或私信。

  在这把几个面试经常考察的排序算法以自己的理解来和大家分享一下。主要是这几个排序:快速排序,堆排序,归并排序,选择排序,直接插入排序等(只是自己现在脑海里还记得的这几个而已,之后说哪几个以博客内容为准,因为写的过程中我会查阅相关资料和博客来写。)

  为了保证每个程序的正确性,以下所有的排序程序都会使用LintCode平台上整数排序II来测试代码(这里是LintCode的网址链接,可以直接点击 http://www.lintcode.com/zh-cn/problem/sort-integers-ii/)

一、说在前面的理论

   快速排序和冒泡排序属于同一类型的排序算法,但是快速排序是冒泡排序的一种改进,它的时间复杂度只有nlogn,而冒泡是n的平方级。

  快速排序的最坏的时间复杂度是O(n2),但平均的时间复杂度为O(nlgn)。这里纠正一个错误,时间复杂度不代表运行时间代价,它只是理论推导的一个结果。真正的运行时间还是具体的数据集具体的程序实现才能看出运行时长。

快速排序是不稳定的排序算法,它在带排序的数据集相对有序时表现较好。

  它的思想是一种分而治之的想法,程序实现是递归的形式。

程序步骤:

1. 选择一个基准元素,通常选择第一个元素或者最后一个元素,

2. 进行一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,

3. 获得基准元素在其排好序后的正确位置,

4. 递归地排序划分好的两部分。


二、上程序

public class quickSort {
	public static void myQSort(int a[],int left,int right) {
		int l = left;
		int r = right;
		if(l<r){
			int key = a[l];
			while(l<r){
				while(l<r && a[r]>=key){
					r--;
				}
				a[l] = a[r];
				while (l<r && a[l]<key){
					l++;
				}
				a[r] = a[l];
			}
			a[l] = key;
			if(l>left)
				myQSort(a, left, l-1);
			if (l<right) {
				myQSort(a, l+1, right);
			}
			
		}
	}
	
	public static void main(String[] args) {
		int a[]={1,2,15,13,19,14,20,5};
		myQSort(a,0,a.length-1);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
		
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值