简单排序算法之快速排序

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比 较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构 上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

算法步骤:

1 从数列中挑出一个元素,称为 “基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。


代码:

文件QucikSort.java

package Lee.sort;

public class QucikSort {
	
	/*
	 * 递归排序
	 * */
	public void qucik_Sort(int sort[], int left, int right){
		//有效性检验
		if(null == sort || left >= right){
			System.out.println("array invalid.");
			return ;
		}
		
		if(left < right){
			
			int div = partition(sort, left, right);
			
			qucik_Sort(sort, left, div - 1);
			qucik_Sort(sort, div + 1, right);
		}
		
	}
	
	/*
	 * 划分数组元素
	 * 返回基准元素的位置,然后再对左右两边无序的元素分别找基准值,直到其无左右元素(即成为单个元素)
	 * */
	private int partition(int sort[], int left, int right){
		int x = sort[left];
		int i = left + 1;
		int j = right;

		
		while(true){
			while(j >= i && sort[j] > x)	//找到第一个小于x的元素
				j--;
			while(i <= j && sort[i] < x)	//找到第一个大于x的元素
				i++;
			if(i >= j){
				break;
			}
			swap(sort, i, j);		//交换找到的元素
			//i++;
			//j--;
			//printArray(sort);	
		}
		
		sort[left] = sort[j];	//重新定位基准元素
		sort[j] = x;	
		printArray(sort);
		return j;
	}
	/**
	 * 交换元素
	 * */
	private void swap(int sort[], int i, int j){
		int temp;
		
		temp = sort[i];
		sort[i] = sort[j];
		sort[j] = temp;
	}
	
	public void printArray(int sort[]){
		for(int i = 0;  i < sort.length; i++){
			System.out.print(sort[i] + " ");
		}
		
		System.out.println();
	}
}

文件SortMain.java

package Lee.sort;

public class SortMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		//MergeSort ms = new MergeSort();
		QucikSort qs = new QucikSort();
		int sort[] = {8, 43, 7, 16, 10, 9, 5, 2, 20};
		//ms.merge_Sort(sort, 0, sort.length - 1);
		qs.qucik_Sort(sort, 0, sort.length - 1);
		
		
	}
	

}
运行结果:

5 2 7 8 10 9 16 43 20 
2 5 7 8 10 9 16 43 20 
array invalid.
array invalid.
2 5 7 8 9 10 16 43 20 
array invalid.
2 5 7 8 9 10 16 43 20 
array invalid.
2 5 7 8 9 10 16 20 43 
array invalid.
array invalid.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值