快速排序
(升序)
找到一个基准点,比基准点小的放在基准点左边,大的放在右边
*单边循环快速排序
package com.tq.sort;
import java.util.Arrays;
/**
* 单边循环快排
* 基准点元素---选择最右边
*/
public class QuickSort1 {
public static void main(String[] args) {
int[] a={5,3,7,2,9,8,1,4};
System.out.println("排序前:"+Arrays.toString(a));
quick(a,0,a.length-1);
System.out.println("排序后:"+Arrays.toString(a));
}
public static void quick(int[] a,int start,int end){
if(start>=end){
return;
}
int num=partition(a,0,end); //得到基准点元素下标
quick(a,start,num-1); //左边分区
quick(a,num+1,end); //右边分区
}
/**
*
* @param a 数组
* @param start 开始位置
* @param end 结束位置
* @return
*/
public static int partition(int[] a,int start,int end){
int pv=a[end]; //基准点元素
int i=start;
for (int j = 0; j <end ; j++) {
if(a[j]<pv){ //j小于基准点元素
swap(a,i,j);
i++;
}
}
swap(a,end,i);
return i; //返回基准点元素位置,确定下一轮分区情况
}
//两个数交换
public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
双边循环快排
package com.tq.sort;
import java.util.Arrays;
/**
* 双边循环快排
* 基准点元素---选择最左边
*/
public class QuickSort2 {
public static void main(String[] args) {
int[] a={5,3,7,2,9,8,1,4,45,12};
System.out.println("排序前:"+Arrays.toString(a));
quick(a,0,a.length-1);
System.out.println("排序后:"+Arrays.toString(a));
}
public static void quick(int[] a,int start,int end){
if(start>=end){
return;
}
int num=partition(a,start,end); //得到基准点元素下标
quick(a,num+1,end); //右边分区
quick(a,start,num-1); //左边分区
}
/**
*
* @param a 数组
* @param start 开始位置
* @param end 结束位置
* @return
*/
public static int partition(int[] a,int start,int end){
int pv=a[start]; //基准点元素
int i=start;
int j=end;
while (i<j){
//j 往右找 比基准点小的元素
while (i<j && a[j]>pv){
j--;
}
//i 往左找 比基准点大的元素
while (i<j && a[i]<=pv){
i++;
}
swap(a,i,j);
}
swap(a,start,j);
return j; //返回基准点元素位置,确定下一轮分区情况
}
//两个数交换
public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}