Java与算法之(2) - 快速排序

原创 2016年08月30日 15:11:52

快速排序的基本思路是,每次选定数列中的一个基准数,将小于基准数的数字都放到基准数左边,大于基准数的数字都放到基准数右边。然后再分别对基准数左右的两个数列分别重复以上过程。仍以4 3 6 2 7 1 5为例。

选定最左侧数字4为基准数,首先从右开始向左找小于4的数,找到第一个数1后停止。然后从左开始向右找到第一个大于4的数,即6。


交换这两个数的位置,得到


继续寻找,仍然从右边开始,从上一步找到1的位置向左寻找小于4的数,找到2停止。然后从左边找到6的位置向右找大于4的数。右移一格后,和右侧来的“探路者”相遇了,这意味着这一轮排序结束。


最后把结束位置的数和基准数交换


观察完成后的数列,可以看到以基准数4为分界线,左边的数全都比4小,右边的数全都比4大。接下来分别对左边的2 3 1和右边的7 6 5重复上面的排序步骤。

2 3 1

以2为基准数 -> 2 1 3 -> 1 2 3

7 6 5

以7为基准数 -> 5 6 7

我们例子中的数字较少,如果数列足够长,对第一次排序后得到的子数列排序,将再得到两个子数列,然后再一分为二、二分为四。。。直到以基准数拆分后两边都只剩下一个数字。首先来看递归形式的实现代码

public class QuickSort {

	public void sort(int left, int right, int... numbers) {
		if (left >= right) {
			return;
		}
		int temp = numbers[left];
		int t = 0;
		int i = left;
		int j = right;
		while (i != j) {
			// 先从右往左找
			while (numbers[j] >= temp && i < j)
				j--;
			// 再从左往右找
			while (numbers[i] <= temp && i < j)
				i++;
			// 交换两个数在数组中的位置
			if (i < j) {
				t = numbers[i];
				numbers[i] = numbers[j];
				numbers[j] = t;
			}
		}
		// 将基准数归位
		numbers[left] = numbers[i];
		numbers[i] = temp;

		sort(left, i - 1, numbers);
		sort(i + 1, right, numbers);
	}
}
测试代码

	public static void main(String[] args) {
		int[] numbers = new int[] { 4, 3, 6, 2, 7, 1, 5 };

		new QuickSort().sort(0, numbers.length - 1, numbers);

		System.out.print("after: ");
		for (int i = 0; i < numbers.length; i++) {
			System.out.print(numbers[i] + "  ");
		}
		System.out.println();
	}
输出

after: 1  2  3  4  5  6  7  
另一种实现方式是使用栈代替递归

	public void sortWithoutRecursion(int left, int right, int... numbers) {
		LinkedList<Integer> stack = new LinkedList<>();
		int index;
		stack.push(left);
		stack.push(right);
		while (!stack.isEmpty()) {
			right = stack.pop();
			left = stack.pop();
			index = partition(left, right, numbers);
			if (left < index - 1) {
				stack.push(left);
				stack.push(index - 1);
			}
			if (right > index + 1) {
				stack.push(index + 1);
				stack.push(right);
			}
		}
	}

	public int partition(int left, int right, int... numbers) {
		int temp = numbers[left];
		while (left < right) {
			while (numbers[right] >= temp && left < right)
				right--;
			numbers[left] = numbers[right];
			while (numbers[left] <= temp && left < right)
				left++;
			numbers[right] = numbers[left];
		}
		numbers[left] = temp;
		return left;
	}

版权声明:欢迎转载, 转载请保留原文链接。

Java实现算法之快速排序

本文参考了:http://blog.csdn.net/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因...
  • Rebirth_Love
  • Rebirth_Love
  • 2016年05月08日 14:21
  • 1089

分治法之快速排序算法理解介绍

分治法之快速排序算法理解介绍
  • qq_26071477
  • qq_26071477
  • 2016年06月11日 21:35
  • 1598

数据结构基础 —— 快速排序 java 实现

快速排序 java 实现一种代码下面的这个 if (last > first) 一定要加 private static void quickSort(Integer[] data, int ...
  • never_cxb
  • never_cxb
  • 2015年11月19日 17:47
  • 635

图文讲解QuickSort快速排序算法(Java版)

什么是快速排序? 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此...
  • IT_ZJYANG
  • IT_ZJYANG
  • 2016年11月30日 14:28
  • 3728

用java写的一个快速排序算法源码(仅供参考)

public class QuickSortTest { public static void main(String[] args){ int a[]={20, 3, 5, 18, 90, 1...
  • zll793027848
  • zll793027848
  • 2013年03月16日 12:23
  • 3377

啊哈算法-----快速排序

上一节的冒泡排序可以说是我们学习第一个真正的排序算法,并且解决了桶排序浪费空间的问题,但在算法的执行效率上却牺牲了很多,它的时间复杂度达到了O(N2)。假如我们的计算机每秒钟可以运行10亿次,那么对1...
  • binyao02123202
  • binyao02123202
  • 2014年02月27日 14:59
  • 4249

算法系列(四)排序算法中篇--归并排序和快速排序

在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。 概述 冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序...
  • robertcpp
  • robertcpp
  • 2016年05月30日 23:04
  • 3415

快速排序与快速选择算法

一、快速排序 (1) 基本思想 (2) C实现 // 快速排序, 平均时间复杂度O(NlogN) void quickSort( DataType* A, int beg, int end ...
  • yangalbert
  • yangalbert
  • 2012年03月26日 14:18
  • 8459

经典算法与数据结构的c++实现——快速排序

因为是经典的算法,所以网上描述一大把,直接上个图,直观些,给记性不好的菜鸟(如我)一点儿提示。 快速排序是冒泡排序的一种改进。通过轴值的选择方法不同,算法的速度也不一样。本文下面的代码采取选择最左...
  • y277an
  • y277an
  • 2016年03月22日 17:24
  • 637

排序算法之快速排序详解(附示例代码)

1.快速排序简介 对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为O(n的平方)的排序算法.虽然最坏情况时间复杂度很差,但是快速排序通常是实际排序应用中最好的选择.因为他的平...
  • liuxu841911548
  • liuxu841911548
  • 2017年02月10日 15:37
  • 1035
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java与算法之(2) - 快速排序
举报原因:
原因补充:

(最多只允许输入30个字)