快速排序算法QuickSort

 

1.说明

快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。

快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。

这边所介绍的第一个快速排序法版本,是在多数的教科书上所提及的版本,因为它最容易理解,也最符合轴心分割与左右进行排序的概念,适合对初学者进行讲解。

2.解法

这边所介绍的快速演算如下:

一趟快速排序的算法是:

  1. 设置两个变量start、end,排序开始的时候:start=1,end=N;
  2. 以第一个数组元素作为关键数据,赋值给pivot,即 pivot=arry[1];
  3. 从end开始向前搜索,即由后开始向前搜索(end--),找到第一个小于pivot的值arry[end],并与arry[start]交换,即swat(arry,start,end);
  4. 从start开始向后搜索,即由前开始向后搜索(start++),找到第一个大于pivot的arry[start],与arry[end]交换,即swat(arry,start,end);
  5. 重复第3、4步,直到 start==end,这个时候arry[start]=arry[end]=pivot,而pivot的位置就是其在整个数组中正确的位置;
  6. 通过递归,将问题规模不断分解。将pivot两边分成两个数组继续求新的pivot,最后解出问题。

3.代码实例

 

4.快速排序实例java版本(ps:2011-11-25)

思路和前面的一样,只是使用java来实现。

public class QuickSortTest1 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int arry[]={5,6,2,7,1};
		int len=arry.length;
		
		System.out.println("数组长度:"+arry.length);
		System.out.print("快速排序前数组元素为:");
		for(int i:arry)
		{
			System.out.print(i+" ");
		}
		System.out.println();
		
		quickSort(arry,0,len-1);
		System.out.print("快速排序后数组元素为:");
		for(int i:arry)
		{
			System.out.print(i+" ");
		}
	}
	
	//一次快速排序所执行的步骤
	public static int quickSortOnce(int []arry,int start,int end)
	{
		int pivot=arry[start];//将首元素最为pivot
		while(start<end)
		{
			//找到第一个大于pivot的arry[end]
			while(pivot<arry[end]&&start<end)
				end--;
			arry[start]=arry[end];
			
			//找到第一个小于pivot的arry[start]
			while(pivot>arry[start]&&start<end)
				start++;
			arry[end]=arry[start];
		}
		//最后start==end以后的位置就是起始pivot存放的位置
		arry[start]=pivot;
		//返回pivot的位置,后面按次位置分解
		return start;
	}
	
	public static void quickSort(int []arry,int start,int end)
	{
		//判断start与end的位置
		if(start>=end)
			return;
		int pivot=quickSortOnce(arry,start,end);
		quickSort(arry,start,pivot-1);
		quickSort(arry,pivot+1,end);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值