java排序之快排

  • Post author:
  • Post category:java
这篇文章来谈谈快排,最近有一种感觉,只要有规律可循的代码,分解成为两部分以后效率就会提高很多。代码思想如下

 这个代码写的是快排,快排最主要的思维就是寻找一个分界值,大的放在一边,小的放在一边,然后递归分别处理大的和小的,

          这里需要注意的是我们在移动游标是需要的是加上等于分界的值,否则的话如果有相等的值就会进入死循环,

          很简单的来说,当以一个数为分界值的时候,那么另一个和他相同的数如果没有到边界是不会移动的

          ,但是无论是大的还是小的递归完成以后就一定会挨着分界值。

代码:

package www.jk.qsort;

import java.util.Arrays;

/**
 * 
 * @author jk 这个代码写的是快排,快排最主要的思维就是寻找一个分界值,大的放在一边,小的放在一边,然后递归分别处理大的和小的,
 *         这里需要注意的是我们在移动游标是需要的是加上等于分界的值,否则的话如果有相等的值就会进入死循环,
 *         很简单的来说,当以一个数为分界值的时候,那么另一个和他相同的数如果没有到边界是不会移动的
 *         ,但是无论是大的还是小的递归完成以后就一定会挨着分界值。
 * 
 */
public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] a = new int[] { 2, 1, 6, 7, 8, 5, 3, 5 };
		quickSort(a, 0, a.length - 1);
		System.out.println(Arrays.toString(a));
	}

	private static void quickSort(int[] a, int begin, int end) {
		//
		int tbegin = begin, tend = end;
		// 将第一个值作为快排序的分界值
		int pivot = a[begin];
		while (tbegin < tend) {
			// 如果两个游标没有交集,或者后面一直大于或等于分界值就一直向前移动
			while (tbegin < tend && a[tend] >= pivot) {
				--tend;
			}
			a[tbegin] = a[tend];
			// 如果两个游标没有交集,或者前面是小于或等于分界值,就一直向后头移动
			while (tbegin < tend && a[tbegin] <= pivot) {
				++tbegin;
			}
			a[tend] = a[tbegin];

		}
		// 将临界值赋值给游标的交集的地方
		a[tbegin] = pivot;
		if (begin < tend) {
			// 递归排序游标的左边
			quickSort(a, begin, tend - 1);
		}
		if (tbegin < end) {
			// 递归排序游标的右边
			quickSort(a, tbegin + 1, end);
		}

	}

}