java快速排序算法

本文详细介绍了快速排序算法的过程及实现方式,通过具体实例演示了如何选取主元并进行数组的划分,最终达到排序的目的。

一直想复习下算法,先把经典的快排复习下,好好理解下分治思想:

先介绍快速排序的算法过程:

[1].记录第一个数位置和最后一个数位置; int i = low; int j = high;
[2].找到主元位置,可以是第一个数,也可以是最后一个,或者随机的一个位置,一般可以以数组中第一个位置的数,
    int povit = a[low],主元选择好了就记录不改变它的值;
[3].如果主元是第一个数,则由 j 从后向前搜索,直到找到第一个小于主元的数,与主元进行交换位置.
[4].然后由 i 从前向后搜索,找到第一个大于主元的数,并与主元交换位置.

[5].重复[3],[4]步骤,直到 i = j;



a[0] ..........a[7]
12,3,5,44,21,8,56,2


主元:a[0] = 12;
-----------------------------------------------------------------
2,3,5,44,21,8,56,12    i = 1; j = 7;

2,3,5,12,21,8,56,44    i = 3;j  =6;
---------------------- 一趟完成,开始第二趟------------------------
2,3,5,8,21,12,56,44    i = 4;j = 5;

2,3,5,8,12,21,56,44    i = 4;j = 4;
---------------------- 一趟完整移位结束,主元移到了 4 的位置------------------------

----------------------此时由主元位置分为前后2个数组-------------------------------
{2,3,5,8} 12 {21,56,44}
----------------------递归对前后2个数组进行上述移位操作---------------------------


package test;

import java.util.Date;
import java.util.Iterator;
import java.util.Properties;

public class test {
	public static void main(String args[])
	{
		test t = new test();
		
		Comparable a[] = {12,3,5,44,21,8,56,2};
		t.quickSort(a, 0, a.length-1);
		
		for(Comparable c : a)
		{
			System.out.print(c.toString()+",");
		}
	}
	
	public void quickSort(Comparable a[],int low,int high)
	{
		if(low < high)
		{
			int i = partition(a,low,high);
			//再递归移位i前面一个数组
			quickSort(a, low,i-1);
			//再递归移位i后面一个数组
			quickSort(a, i+1, high);
		}
	}

	public int partition(Comparable a[],int low,int high)
	{
		    int i = low;
		    int j = high;
		    
		    //主元
		    Comparable pivot = a[low];
		    
		    if(low<high)
		   {
		        while(i != j)
		        {
		        	printA(a);
					//从j开始往前扫描直到第一个小于主元的数字出现,与主元交换
					while(i < j)
					{
					    if(a[j].compareTo(pivot) < 0)
						{
							swap(a, j,i);
							break;
						}
						j--;
					}
					if(i < j)
					{
						//此时,因为与i互换了位置,i需要向后移动一位
						i++;
					}
					
					//从i开始往后扫描,直到第一个大于主元的数字出现,与主元交换
					while(i<j)
					{
						if(a[i].compareTo(pivot) > 0)
						{
							swap(a,i,j);
							break;
						}
						i++;
					}
					
					if(i<j)
					{
						//此时,因为与j互换了位置,j需要向前移动一位
						j--;
					}
					
					printA(a);
				}
		   }
		    return i;	
	}
	
	public int partition2(Comparable a[],int l, int r)
	{
		int i = l, j = r;
		Comparable x = a[l]; //s[l]即s[i]就是第一个坑
		while (i < j)
		{
			// 从右向左找小于x的数来填s[i]
			while(i < j && a[j].compareTo(x) >= 0) 
				j--;  
			if(i < j) 
			{
				a[i] = a[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
				i++;
			}

			// 从左向右找大于或等于x的数来填s[j]
			while(i < j && a[i].compareTo(x) < 0)
				i++;  
			if(i < j) 
			{
				a[j] = a[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
				j--;
			}
		}
		//退出时,i等于j。将x填到这个坑中。
		a[i] = x;

		return i;
	}
	
	public void swap(Comparable a[],int i, int j)
	{
	    Comparable temp = a[i];
		a[i] = a[j];
		a[j] = temp;
	}

	public void printA(Comparable a[])
	{
		for(Comparable c : a)
		{
			System.out.print(c.toString()+",");
		}
		System.out.println();
	}
}


parttition2 也是很好理解的,出自 http://blog.youkuaiyun.com/morewindows/article/details/6684558

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值