热爱诗与歌,享受编程每一刻。

IT菜鸟,技术大low。

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

左右指针法实现思路:

(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 排序算法
上一篇java 排序算法之快速排序(挖坑法)
下一篇java多线程中synchronized同步代码块执行问题
想对作者说点什么? 我来说一句

P110指针一、30个数的平均值

2015年01月31日 2KB 下载

汇编语言的三种排序算法

2009年05月10日 3KB 下载

排序算法ppt

2012年03月12日 1.35MB 下载

java的各种排序算法

2011年10月16日 46KB 下载

没有更多推荐了,返回首页

关闭
关闭