[原]Java 快速排序

探讨一下快速排序:

    快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 

 

快速排序动态图: 

  快速排序动态图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

使用快速排序法对一列数字进行排序的过程
分类排序算法
数据结构Varies
最差时间复杂度Θ(n2)
最优时间复杂度Θ(nlogn)
平均时间复杂度 Θ(nlogn) comparisons
最差空间复杂度根据实现的方式不同而不同
最佳算法有时是

 

首先构造了基本的数据结果如下,这两个算作工具吧,一个是用于标记尚未排序区间的Pointer,另一个是基本栈结构。

 

/* 栈元素,用于记录尚未排序的区间*/
class Pointer
{
	int start,end;
	public Pointer(int x,int y)
	{
		this.start = x;
		this.end = y;
	}
}
/* 栈,用于存放Pointer的静态数组,不可动态自增维度*/
 class Stack
{
	 private final static int MAX =20;
	 private  static Pointer [] container; 
	 static int place = -1;
	 public Stack()
	 {
		 container = new Pointer[MAX];
	 }
	
	public   void Push(Pointer element)
	{
		if(place>=-1 && place<MAX-1)
		container[++place] = element;
	}
	
	public boolean isEmpty()
	{
		if(place ==-1)
			return true;
		else
			return false;
	}
	
	public Pointer Pop()
	{
		if(place == -1 || place>=20)
			return null;
		else
		{
			
			return container[place --];
		}
	}
}
算法如下:
public class QuickSort 
{
	
	public static void main(String [] arg)
	{
		int [] src ={83 ,19 ,3 ,62 ,27 ,56 ,9 ,24 ,60 ,88 };
			
                //BubbleSort.createRandom(10, 0, 100);
		
		stack  = new Stack();
		stack.Push(new Pointer(0,src.length -1));


		while(!stack.isEmpty())
		{//递归开始
			Pointer p = (Pointer)stack.Pop();
			int index = sortOnce(src,p.start,p.end);

			if(index - p.start >=1)
				stack.Push(new Pointer(p.start,index-1));
			if(p.end - index-1 >=1)
				stack.Push(new Pointer(index+1,p.end));
		}
		System.out.println("\nend:");
		for(int elements : src)
		{
			System.out.print(elements+" ");
			
		}
		System.out.println("");
	}
	
	static Stack stack ;

	
	public static int sortOnce(int [] quene, int start , int end)
	{
		//当quene是整个的时候,start = 0 , end = quene.length -1 
		
                int pivot;//基准
		pivot = quene[start];
		
		int i = start,j=end;
		while(i<j)
		{
			
			while(quene[j] > pivot && i<j)
				j--;
			if(i<j)
			quene[i++] = quene[j];

			while(quene[i] < pivot && i<j)
				i++;
			if(i<j)
			quene[j--] = quene[i];
			
		}
		
		quene[i] = pivot;
		
		for( int element:quene)
		{
			System.out.print(element+ " ");
		}
		System.out.println(" index="+i);
		
		return i;
	}
	

}
结果:
60 19 3 62 27 56 9 24 83 88  index=8
24 19 3 9 27 56 60 62 83 88  index=6
9 19 3 24 27 56 60 62 83 88  index=3
9 19 3 24 27 56 60 62 83 88  index=4
3 9 19 24 27 56 60 62 83 88  index=1
3 9 19 24 27 56 60 62 83 88  index=0

end:
3 9 19 24 27 56 60 62 83 88  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值