Java 划分排序

划分:

指定一个关键值key

从左右两边进行循环划分操作,将小于等于key的放左边,大于等于key的放右边

划分后的序列不一定全部有序

O(N)  只有一趟排序

/**
 * 划分
 *
 * @author stone
 * @date   2015-7-29 下午4:37:16
 */
public class Partition {

	public static void main(String[] args) {
		int[] ary = Util.generateIntArray(10);
		Util.printArray(ary);
		int pivot = 3;
		int partDex = sort(ary, 0, ary.length - 1, pivot);
		System.out.println("关键值是" + pivot + ",划分的index是" + partDex);
		Util.printArray(ary);

	}

	private static int sort(int[] ary, int left, int right, int pivot) {
		int leftPtr = left - 1;  //左边 再左一位   操作时需要先++
		int rightPtr = right + 1; //右边 再右一位  操作时需要先--
		while (true) {
			while (leftPtr < right && ary[++leftPtr] <= pivot); //leftPtr指向的项 > 关键值 停止
			while (rightPtr > left && ary[--rightPtr] >= pivot); //rightPtr指向的项 < 关键值 停止
			if (leftPtr >= rightPtr) {
				break;
			} else {
				//leftPtr rightPtr 指向的项所在的位置都不正确  应该交换
				swap(ary, leftPtr, rightPtr);
			}
			/*
			 *  继续下一次循环。 前面的错误位置的项已经交换了。 左右指针继续移动
			 */
		}
		System.out.println("l=" + leftPtr + ",r=" + rightPtr);
		return rightPtr;//返回 leftPtr也可以
	}

	private static void swap(int[] ary, int a, int b) {
		int temp = ary[a];
		ary[a] = ary[b];
		ary[b] = temp;
	}
}

输出

[2, 6, 9, 8, 4, 0, 5, 1, 7, 3]
l=3,r=2
关键值是3,划分的index是2
[2, 1, 0, 8, 4, 9, 5, 6, 7, 3]

结果:

在<=index 的位置 <key; 在>index的位置>=key

在<=index 的位置 <=key; 在>=index的位置>key

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-16 09:40:10

Java 划分排序的相关文章

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

Java 常用排序算法/程序员必须掌握的 8大排序算法

Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n 个数插到前

java Map排序(升序、降序、随机排序)

基础知识: 1 HashMap会使用key,根据hashcode进行默认排序. 2  LinkedHashMap根据存入先后进行排序 代码展示: 1 随机排序 java Map排序(升序.降序.随机排序),布布扣,bubuko.com

Java-集合--Java集合排序

Java集合排序 前几天在工作的当中遇到对List<Map<String,String>>这样的数据结构按照Map<String,String>中的某个字段排序, 具体的实现为: <span style="font-size:18px;">public void sortList(List<Map<String, String>> list, final String field) { Collections.so

java编程排序之自定义类型的集合,按业务需求排序

自定义引用类型放入集合中,按实际业务需求进行排序的两种思路 第一种思路: (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object obj)方法.自定义业务比较规则 (2)利用java.util.Collections类的静态方法sort(List<自定义类型> list)进行排序(默认升序)或者.自己编写排序工具类.冒泡+compareTo(obj)方法 第二种思路 (1)自己编写业务比较规则类.实体类不用实现任何借口.业

java希尔排序算法

原文:java希尔排序算法 代码下载地址:http://www.zuidaima.com/share/1550463279090688.htm 希尔排序算法的基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插人排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<-<d2<d1),即所有记录放在同一组中进行直接插入排序为止.该方法实质上是一种

Java对象排序小测试

import java.util.ArrayList; import java.util.Collections; import java.util.List; /**  * Java对象排序  */ public class User implements Comparable<User> {     private int idx;     public User(int idx) {         this.idx = idx;     }     public int getIdx(

Java集合排序

java集合排序 如何给Java中List集合排序呢?前端时间在工作中遇到类似于给这样的结构排序List<Map<String,String>>>按照其中Map中的某个key值排序呢? 集合产生如下: <span style="font-size:18px;">public void sortList(){ List<List<Map<String,String>>> list = new ArrayList

java选择排序

/** * Created by rabbit on 2014-5-9. */ class ArrayTest2 {     public static void SelectSort(int [] arr) //定义选择排序的方法     {         for (int x=0;x<arr.length;x++)         {             for (int y=0;y<arr.length-1;y++)             {                 if