62,635
社区成员




public static void quickSort(Integer[] arr,int start, int end) {
int flag = arr[start];
int position = start;
for(int i=start+1; i<end; i++){
if(flag >= arr[i]) {
move(arr,position++,i);
}
}
if(position - start > 2)
quickSort(arr, start, position);
if(end - position > 2)
quickSort(arr, position+1, end);
}
private static void move(Integer[] arr, int a, int b) {
for(int i=b; i>a; i--){
swap(arr, i, i-1);
}
}
private static void swap(Integer[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
// 类属性
Stack<Integer> st = new Stack<Integer>();
// 主方法调用qsort
st.push(length);
st.push(0);
while( !st.empty() ){
qsort(array, st.pop(), st.pop());
}
// qsort改递归为压栈
public void qsort(int[] array,int low, int high) {
if (low < high) {
int pivot = partition2(array, low, high);
st.push(high);
st.push(pivot+1);
st.push(pivot-1);
st.push(low);
}
}
public class Qsort {
public static int []array;
public void swap(int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
private int partition2(int[] array, int low, int high) {
int pivot = low;// 中枢元素位置,我们以第一个元素为中枢元素
// 退出条件这里只可能是 low = high
while (true) {
if (pivot != high) {// 如果中枢元素在低指针位置时,我们移动高指针
// 如果高指针元素小于中枢元素时,则与中枢元素交换
if (array[high]<array[pivot]) {
swap(array, high, pivot);
// 交换后中枢元素在高指针位置了
pivot = high;
} else {// 如果未找到小于中枢元素,则高指针前移继续找
high--;
}
} else {// 否则中枢元素在高指针位置
// 如果低指针元素大于中枢元素时,则与中枢元素交换
if (array[low]>array[pivot]) {
swap(array, low, pivot);
// 交换后中枢元素在低指针位置了
pivot = low;
} else {// 如果未找到大于中枢元素,则低指针后移继续找
low++;
}
}
if (low == high) {
break;
}
}
// 返回中枢元素所在位置,以便下次分区
return pivot;
}
public void qsort(int[] array,int low, int high) {
/*
* 如果分区中的低指针小于高指针时循环;如果low=higth说明数组只有一个元素,无需再处理; 如果low >
* higth,则说明上次枢纽元素的位置pivot就是low或者是higth,此种情况 下分区不存,也不需处理
*/
if (low < high) {
// 对分区进行排序整理
// int pivot = partition1(array, low, high);
int pivot = partition2(array, low, high);
// int pivot = partition3(array, low, high);
/*
* 以pivot为边界,把数组分成三部分[low, pivot - 1]、[pivot]、[pivot + 1, high]
* 其中[pivot]为枢纽元素,不需处理,再对[low, pivot - 1]与[pivot + 1, high]
* 各自进行分区排序整理与进一步分区
*/
qsort(array, low, pivot - 1);
qsort(array, pivot + 1, high);
}
}
public static void main(String[] args) {
Array a=new Array();
array=a.productArray();
Qsort q=new Qsort();
int length=array.length-1;
long startTime = System.currentTimeMillis();
q.qsort(array, 0, length);
long endTime = System.currentTimeMillis();
System.out.println("排序时间:"+(endTime-startTime)+"ms");
}
}