java 排序算法之快速排序(左右指针法)

原创 2018年04月16日 19:24:33

左右指针法实现思路:

(1).在一段区间内我们有一个基准值baseValue,向左移动hi指针,从右边区间向左进行遍历,直到找到一个小于baseValue的值就停下,然后再从左边移动low,向右遍历找小于baseValue的值,找到第一个一个也停下来。我们将左右的值进行交换,这样左边那个大于key的值就被换到了右边,而右边那个比key小的值就被换到了左边。

(2).重复步骤(1),当左右两个指针相遇的时候(low=hi)就说明所有元素都与baseValue做过了比较。然后再将low指针(其实也是hi指针)所在的元素赋值给baseValue,同时将基准值赋给low位置。此时按照上述方法进行递归实现[0, low-1]和[low+1, arrays.length-1]。

package com.wang.sort;

import java.util.Arrays;

/**
 * 快速排序之左右指针<br>
 * 选择最左端的为基准值(pivot)<br>
 * 从右向左遍历,移动hi指针,找到第一个比基准值小的值。<br>
 * 从左向右遍历,移动low指针,找到第一个比基准值大的值。<br>
 * 交换此时low和hi指针位置的数值。循环进行,直到low=hi<br>
 * low等于hi时,把基准值位置与low位置的数值互换。<br>
 * 相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区<br>
 * (partition)操作<br>
 * 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
 * @author wang
 * @Date 2018年4月16日
 *
 */
public class LeftAndRightPointer {
	
	public static void main(String[] args) {
		
		int[] arrays = {12,21,3,5,2,18,7,4,11,9,12};
		System.out.println("快速排序之左右指针排序前:"+Arrays.toString(arrays));
		quickSort(arrays , 0 , arrays.length - 1);
		System.out.println("快速排序之左右指针排序后:"+Arrays.toString(arrays));
		

	}
	
	public static void quickSort(int[] arrays,int low,int hi){
		
		if(low < hi){
		
		//求每次分治的分割线
		int divideIndex = getDivideIndex(arrays,low,hi);
		//再递归分别对分割的俩个子数组进行递归排序
		quickSort(arrays,low,divideIndex -1);
		quickSort(arrays,divideIndex + 1, hi);
		
	}
		
	}
	
	public static int getDivideIndex(int[] arrays,int low,int hi){
		//设定arrays[low]为基准值,从右到左移动hi,找到大于第一个大于基准值的数字。
		//从左向右移动low指针,找到第一个小于基准值的数,交换low和high位置上的值
		//直到low=high的时候,将基准值填入arrays[low]
		int baseValue = arrays[low];
		int oldLow = low;
		while(low < hi){
			while (low < hi && arrays[hi] >= baseValue){
				
				hi-- ;
			}
			
			while( low < hi && arrays[low] <= baseValue){
				low++ ;
			}
			if( low < hi){
			swap(arrays,low ,hi);
			}
			
			
		}
		
		if(low == hi){
			arrays[oldLow] = arrays[low];
			arrays[low] = baseValue ;
			
			
		}
		return low;
	}
	
	public static  void swap( int[] arrays ,int low ,int high){
		
		int temp = 0;
		temp = arrays[low] ;
		arrays[low] = arrays[high] ;
		arrays[high] = temp;
		
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011059021/article/details/79964809

数据结构JAVA版2017教学视频课程

-
  • 1970年01月01日 08:00

排序算法---之交换排序(冒泡排序&快速排序-左右指针法,挖坑法,前后指针法)

排序算法----交换排序(冒泡排序&快速排序) 一、排序算法分为:      1.插入排序(直接插入排序&希尔排序)      2.选择排序(直接选择排序&堆排序)  ...
  • Monster66jxx
  • Monster66jxx
  • 2017-08-31 14:59:46
  • 147

经典排序算法-快速排序(挖坑法、前后指针法)、基数排序

快速排序在实际应用中是比较表现好的排序算法。快速排序我用两种方法实现它。 第一种为方法,形象的称为:挖坑法 基本思路:1、寻找pos位,然后将其分为两段数组,然后对这两段数组递归排序;     ...
  • he_shuai20
  • he_shuai20
  • 2017-05-26 14:21:02
  • 1367

【数据结构】快速(QuickSort)排序之——左右指针法

【数据结构】快速(QuickSort)排序之——左右指针法
  • LX18792732127
  • LX18792732127
  • 2017-05-15 11:50:13
  • 552

快速排序法 quickSort---java

快速排序法: public class Main { public static void main(String[] args) { int a[]={7,8,1,3...
  • uniquewonderq
  • uniquewonderq
  • 2015-08-17 11:32:05
  • 643

快排 ——前后指针法

int partion(int arr[], int left, int right) { if (left < right) { int key = arr[right]; int pr...
  • My_heart_
  • My_heart_
  • 2016-09-07 15:09:34
  • 549

C\C++ 快速排序

转自:点击打开链接 高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6  1  2 7  9 ...
  • yanghongche
  • yanghongche
  • 2016-08-08 16:41:30
  • 197

快速排序经典算法(分治法,挖坑法,前后指针法,非递归)

快速排序最优的情况就是当关键值位于序列中间时 快速排序最坏的情况就是对已序的序列进行排序 时间复杂度:O(N^2)最差 使用场景:数据量大而杂乱的序列,避免出现最坏的情况 快速排序递归算法之分...
  • qq_35420908
  • qq_35420908
  • 2017-08-04 14:36:42
  • 513

C++快速排序实现(quicksort) (算法导论)

quicksort:分治思想。 分解:数组A[p, r)被划分成两个子数组A[p..q) 和 A[q+1, r),使得A[p..q)中的每个元素小于等于A[q], A[q]也小于A[q+1..r)中的...
  • WangPegasus
  • WangPegasus
  • 2014-03-05 11:52:46
  • 1454

快速排序算法(两个指针一前一后逐步向后扫描)

//快速排序的另一种方法:以最后一个元素为枢轴值,从前往后进行比较, //那么一次快速排序后,枢轴左边的元素的相对位置不变。 #include using namespace std; int Par...
  • Cr_goforit
  • Cr_goforit
  • 2015-09-10 16:25:19
  • 266
收藏助手
不良信息举报
您举报文章:java 排序算法之快速排序(左右指针法)
举报原因:
原因补充:

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