//快速排序
public class quickPaixu {
//优化:选取左中右三个元素,求出中位数, 放入数组最左边的a[low]中
private static int selectMiddleOfThree(int[] a, int low, int high) {
int middle = low + (high - low)/2; // 取得位于数组中间的元素middle
if(a[low]>a[high]) {
swap(a, low, high); //此时有 a[low] < a[high]
}
if(a[middle]>a[high]){
swap(a, middle, high); //此时有 a[low], a[middle] < a[high]
}
if(a[middle]>a[low]) {
swap(a, middle, low); //此时有a[middle]< a[low] < a[high]
}
return a[low]; // a[low]的值已经被换成三数中的中位数, 将其返回
}
public void quickSort(int[] a, int left, int right) {
if (left > right) {
return;
}
int base = selectMiddleOfThree( a, left, right); //选定一个基准数
int i = left, j = right;
while(i!=j) {
//先从右遍历,找比基准小的数,找到停下来
while (a[j] >= base && i < j) {
j--;
}
//再从左遍历,找比基准大的数,找到停下来
while (a[i]<=base && i<j) {
i++;
}
//交换i和j
swap(a, i, j);
}
//i和j相遇了,就规整base
a[left] = a[i];
a[i] = base;
quickSort(a, left, i - 1);
quickSort(a, j + 1, right);
}
public void swap(int[] a, int m, int n) {
int t = a[m];
a[m] = a[n];
a[n] = t;
}
public void print(int[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void main(String[] args) {
int[] arry = new int[]{3, 2, 5, 28,14, 7, 6, 9, 1};
quickPaixu quickPaixu = new quickPaixu();
quickPaixu.quickSort(arry, 0, arry.length - 1);
quickPaixu.print(arry);
}
}
快速排序java
最新推荐文章于 2023-06-04 10:54:50 发布