Java 划分排序

来源:互联网 发布:数据库基础及应用答案 编辑:程序博客网 时间:2024/05/13 18:23

划分排序:

指定一个关键值key

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

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

O(N)  只有一趟排序

/**  * 划分   *   * @author stone  * @date   2015-7-29 下午4:37:16  */  public class Partition {/** * 基于base划分,小的在左,大的在右, 不要求整个序列有序 *  * @param ary * @param base */static void sort(int[] ary, int base) {int left = 0;int right = ary.length - 1;int leftpoint = left, rightpoint = right;while (true) {// 分成左右两边同时进行比较,一边从左向右,一边从右向左,while (leftpoint < right && ary[leftpoint++] < base); //leftpoint大于right或ary[leftpoint]>base停止循环while (rightpoint >= left && ary[rightpoint--] > base); //反之System.out.println("左边需要交换的索引:" + (leftpoint-1));System.out.println("右边需要交换的索引:"+ (rightpoint+1));//上面拿到了不符合条件的两个索引,即需要交换的两个索引if (leftpoint - 1 < rightpoint + 1) {//需要交换swap(ary, leftpoint - 1, rightpoint + 1);Util.printArray(ary);leftpoint = left;rightpoint = right;} else {break;}}}private static void swap(int[] ary, int a, int b) {int temp = ary[a];ary[a] = ary[b];ary[b] = temp;}public static void main(String[] args) {int[] ary = Util.generateIntArray(10);System.out.println("原序列:");Util.printArray(ary);sort(ary, 5);System.out.println("排序后:");Util.printArray(ary);}}

原序列:[2, 8, 4, 3, 7, 5, 1, 9, 0, 6]左边需要交换的索引:1右边需要交换的索引:8[2, 0, 4, 3, 7, 5, 1, 9, 8, 6]左边需要交换的索引:4右边需要交换的索引:6[2, 0, 4, 3, 1, 5, 7, 9, 8, 6]左边需要交换的索引:5右边需要交换的索引:5排序后:[2, 0, 4, 3, 1, 5, 7, 9, 8, 6]


0 0