Fork me on GitHub

JAVA算法系列 快速排序

java算法系列之排序

手写快排

首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,ij
之后,开始按住左哨兵(i),让右哨兵(j)往左走(j--),找到比key小的元素后,按住右哨兵(j),开始让左哨兵往右走(i++),直到找到比key大的元素,让i和j脚下的值互换,此时完成第一趟快排,之后开始按照这个思路进行while循环,跳出循环的条件很简单,就是当两个哨兵碰头了,就跳出循环,此时,左边一块永远比key小,右边一块始终比key大!然后来个递归,对左右这两块进行一次快排,就o了。


package com.rsc.sort;

/**
 * 人生中第一个快排
 * 
 * @author 
 * @落雨 http://ae6623.cn
 */
public class QuickSort {

	
	public static void quickSort(int[] a, int l, int r) {
		int i = l;
		int j = r;

		if (l > r) {
			return;
		}

		int key = a[l]; // 基准位key
		while (i != j) {
			// 先从右边的哨兵开始找
			while (i < j && a[j] >= key) {
				j--; // 直到找到了 a[j]<key的一个值,就停下来,得到了下标j
			}
			// 然后开始从左向右寻找

			while (i < j && a[i] <= key) {
				i++;
			}

			if (i < j) {
				key = a[j];// 将key和a[j]交换
				a[i] = a[j];// 将a[j]和a[i]互换,此时完成a[i]的赋值
				a[j] = key;// 成功将a[j]和a[i]互换
			}
		}

		// 现在将key归位
		a[l] = a[i];
		a[i] = key;
		System.out.println("基准位:" + key);

		// 递归处理左右两块
		quickSort(a, l, i - 1); // 从左边开始一直到i-1,也就是基准位的前一位的排序
		quickSort(a, i + 1, r); // 从i+1开始到最右边

		for (int k : a) {
			System.out.print(k + " ");
		}
		System.out.println();

	}

	public static void main(String[] args) {
		int[] array = { 2, 1, 5, 4, 3, 7, 6 };
		quickSort(array, 0, array.length - 1);

	}

}


打印结果如下:

基准位:2
基准位:1
1 2 5 4 3 7 6 
基准位:5
基准位:3
基准位:4
1 2 3 4 5 7 6 
1 2 3 4 5 7 6 
基准位:7
基准位:6
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
1 2 3 4 5 6 7 
posted @ 2015-06-04 15:46  _落雨  阅读(279)  评论(0编辑  收藏  举报