package test;
import java.util.Arrays;
import java.util.Random;
public class Partition {
//方法一
private int partition(int[] data, int length, int start, int end) throws Exception{
System.out.println(Arrays.toString(data));
if(data == null || length<=0 || start<0|| end>=length)
throw new Exception();
Random random = new Random();
int index = random.nextInt(end)%(end-start+1) + start;
System.out.println("index : "+index);
swap(data, index, end);
System.out.println(Arrays.toString(data));
int small = start-1;
for(index=start; index<end; ++index){
if(data[index]<data[end]){
++small;
if(small != index)
swap(data, index, small);
System.out.println(Arrays.toString(data));
}
}
++small;
swap(data, small, end);
System.out.println(Arrays.toString(data));
System.out.println(small);
System.out.println(Arrays.toString(data));
return small;
}
public void quickSort(int[] data, int length, int start, int end) throws Exception{
if(start == end){
return;
}
int index = partition(data, length, start, end);
if(index > start)
quickSort(data, length, start, index-1);
if(index<end)
quickSort(data, length, index+1, end);
}
//方法二
private int partition(int[] data, int left, int right){
if(data ==null)
throw new NullPointerException();
int temp = data[left];
while(left < right){
while (left<right && data[right] > temp)
right--;
if(left<right)
data[left++] = data[right];
while(left<right && data[left] < temp)
left++;
if(left<right)
data[right--] = data[left];
}
data[left] = temp;
return left;
}
public void quickSort(int[] data, int left, int right) throws Exception{
if(left == right){
return;
}
int index = partition(data, left, right);
if(index > left)
quickSort(data, left, index-1);
if(index<right)
quickSort(data, index+1, right);
}
private void swap(int[] data, int index, int end){
int temp = data[index];
data[index] = data[end];
data[end] = temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data = {49,58,32,36,29,46,97};
int[] data2 = {49,58,32,36,29,46,97};
Partition partition = new Partition();
try {
partition.quickSort(data, data.length, 0, data.length-1);
partition.quickSort(data, data.length, 0, data.length-1);
System.out.println(Arrays.toString(data));
System.out.println("==================================");
partition.quickSort(data2, 0, data2.length-1);
System.out.println(Arrays.toString(data2));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
快速排序的两种实现方式,主要是Partition函数的实现原理不一样
最新推荐文章于 2021-12-05 11:50:31 发布