快速排序原理及JAVA实现

标签: 快速排序 排序算法 Java
56人阅读 评论(0) 收藏 举报
分类:

交换类排序

  • 基本思想:对待排序记录的关键字两两进行比较,只要发现两个记录为逆序就进行交换,直到没有逆序的记录为止。(如果要将整个记录序列调整为递增序列,那么关键字之间是递减关系即为逆序。)

快速排序基于分治策略思想。属于交换类排序。

分治策略基本思想:将原问题分解为若干个规模更小但结构与原问题相似的问题递归地解决这些子问题,然后将这些子问题的解组合为原问题的解。

快速排序基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都小于等于另外一部分的所有数据,然后再按此方法对这两部分数据分别进行快速排序,整个过程可以递归进行,以此达到整个数据变成有序序列。

基本做法

从待排序列中任意选择一个记录,以该记录的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,关键字大于等于枢轴的记录均移动至该记录之后。致使一趟排序之后,记录的无序序列K[0……n-1]将分割成左右两个子序列,然后分别对分割所得两个序列递归地进行快速排序,以此类推,直至每个子序列中只含一个记录为止。

一趟快速排序步骤

  1. 设置两个变量low、high,分别为待排序列数组的第一个和最后一个元素下标,即,low = 0,high = arr.length-1;
  2. 从待排序列中任意选择一个记录作为“枢轴”,一般选第一个关键字作为枢轴,即key = arr[low];
  3. 用下标为high的记录和key比较,如果arr[high] >= key,则high继续逆向向前搜索,直到找到小于key的记录arr[high],放到下标为low的arr[low]位置(没必要和arr[low]交换,因为此时arr[low]的值被保存在了key中,已有备份,不会丢失);
  4. 用下标为low的记录和key比较,如果arr[low] < key,则low继续正向向后搜索,直到找到大于等于key的记录arr[low],放到下标为high的arr[high]位置(没必要和arr[high]交换,因为此时arr[high]的值已有备份,不会丢失);
  5. 重复第3、4步,直到low与high交汇,即,low == high,把枢轴值放到交汇处的记录上,即arr[low] = key。

具体实现

待排序列为{6, 1, 8, 3, 5, 9, 2},给出快速排序的完整过程。


步骤一:设置变量low、high。


步骤二:选择枢轴。


步骤三:arr[high]与枢轴值key比较,若arr[high] >= key,high继续逆向向前搜索;否则,arr[low] = arr[high]。


步骤四:arr[low]与枢轴值key比较,若arr[low] < key,low继续正向向后搜索;否则,arr[high] = arr[low]。


继续正向向后搜索。


继续正向向后搜索。


步骤五:重复。

重复步骤三。


继续逆向向前搜索。


继续逆向向前搜索。


重复步骤四。


继续正向向前搜索。


继续正向向前搜索。


low与high交汇。arr[low] = key。

此时,一趟快速排序完成。以此时key = 6把待排序列分成两部分,key = 6前面都是小于key的值,后面都是大于等于key的值。

然后将代排序列分割成左右两个子序列,分别对分割所得两个子序列递归地进行快速排序,以此类推,直到每个子序列中只含有一个记录为止。

该序列快速排序的各趟结果如下:


在第三趟排序之后,每个子序列都只有一个记录了。此时,发现序列已经成为有序序列了。

代码实现

public class QuickSort {
	
	/**
	 * 一趟快速排序
	 * @param arr
	 * @param low
	 * @param high
	 * @return
	 */
	private static int oneQuickSort(int[] arr, int low, int high) {
		int key = arr[low];
		while(low < high) {
			while(low < high && arr[high] >= key) {
				high--;
			}
			arr[low] = arr[high];
			
			while(low < high && arr[low] < key) {
				low++;
			}
			arr[high] = arr[low];
		}
		arr[low] = key;
		
		return low;
	}
	
	/**
	 * 快速排序核心
	 * @param arr
	 * @param low
	 * @param high
	 */
	public static void quickSort(int[] arr, int low, int high) {
		if(null == arr) {
			return;
		}
		
		if(low < high) {
			//一趟快速排序得到枢轴下标
			int mid = oneQuickSort(arr, low, high);
			//对左右子序列进行递归
			quickSort(arr, low, mid-1);
			quickSort(arr, mid+1, high);
		}
	}
	
	private static void showArr(int[] arr) {
		for(int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
	}
	
	public static void main(String[] args) {
		int[] arr = {6, 1, 8, 3, 5, 9, 2};
		/**
		 * 快速排序
		 * 先设置变量low、high
		 * low = 0
		 * high = arr.length-1
		 */
		quickSort(arr, 0, arr.length-1);
		showArr(arr);
	}
}

运行结果


效率

时间复杂度:O(nlogn);

空间复杂度:O(logn);

稳定性:不稳定排序。

说明:logn是以2为底n的对数


查看评论

快速排序原理及java实现

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排...
  • crazy_rain
  • crazy_rain
  • 2007-04-20 10:44:00
  • 12607

【排序算法】快速排序原理及Java实现

快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直...
  • jianyuerensheng
  • jianyuerensheng
  • 2016-04-27 09:08:20
  • 36323

快速排序的原理以及Java代码

1.概念:所谓排序就是比较两个关键字大小,然后将一个序列的记录从一个位置移动到另一个位置,以达到一个从小到大的有序的序列,快速排序属于交换排序的一种。 2.基本思想:它的基本思想是通过一趟排序,将待...
  • qq_34520606
  • qq_34520606
  • 2017-07-24 21:54:57
  • 181

快速排序(QuickSort)原理及Java 实现

快速排序(QuickSort )是常用到的效率比较高的一种排序算法,在面试过程中也经常提及。下面就详细讲解一下他的原理、给出一个Java版本的实现。 快速排序思想: 通过对数据元素集合Rn 进行一...
  • sun_star1chen
  • sun_star1chen
  • 2014-01-15 09:14:45
  • 5226

算法 -- Java实现快速排序(图解 + 代码实现)

算法 -- Java实现快速排序(图解 + 代码实现)...
  • feng2qing
  • feng2qing
  • 2016-12-25 10:58:07
  • 1252

快速排序 的原理及其java实现(递归与非递归)

快速排序 的原理及其java实现(递归与非递归)
  • mine_song
  • mine_song
  • 2017-03-20 09:25:49
  • 745

快速排序的两种实现方式,主要是Partition函数的实现原理不一样

package test; import java.util.Arrays; import java.util.Random; public class Partition { //方法一 p...
  • yuhushangwei
  • yuhushangwei
  • 2016-10-06 10:12:49
  • 892

随机快速排序的java代码

public class Randomized_QuickSort {     public static void main(String[] args) {           Randomi...
  • randomnet
  • randomnet
  • 2012-03-11 13:51:32
  • 2094

快速排序——JAVA实现(图文并茂)

高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数...
  • as02446418
  • as02446418
  • 2015-08-10 11:08:15
  • 8061

快速排序原理及Java实现

1、基本思想: 快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字...
  • yan8024
  • yan8024
  • 2017-06-12 12:21:04
  • 1937
    个人资料
    等级:
    访问量: 1269
    积分: 233
    排名: 31万+
    文章存档