您的位置:首页 > 编程语言 > Java开发

Java 划分排序

2015-07-29 17:26 483 查看
划分排序:
指定一个关键值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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: