快速排序

快速排序用到了一个分支的思想,首先选取一个基数,然后调整数组,分成两个子区间,左边的子区间小于等于基数,右边的子区间大于等于基数。然后递归地对两个子区间进行排序。

import com.sun.org.apache.bcel.internal.generic.FSUB;
import org.junit.Test;

import java.util.Arrays;

public class QuickSort {
    public void swap(int[] array, int a, int b) {
        int tmp = array[a];
        array[a] = array[b];
        array[b] = tmp;
    }
private void SubSort(int[] arr, int start, int end) {
if (start < end) { // start == end时不用排序
int base = arr[start]; // 基准
System.out.println("选取的base为:" + base);

int left = start; // 开,left的值一定在start右边,注意后面使用的++left
int right = end + 1; // 开,right的值一定在end+1左边,注意后面使用的--right

while (true) {
while (left < end && arr[++left] <= base) ; // 从左往右,找到第一个大于base的位置
while (right > start && arr[--right] >= base) ; // 从右往左,找到第一个小于base的位置

if (left < right) swap(arr, left, right);
else break;
}
swap(arr, start, right);
// 递归
SubSort(arr, start, right-1);
SubSort(arr, right+1, end);
}
}

public void QuickSort(int[] arr) {
if (arr == null || arr.length == 0) {
System.out.println("Null or Empty array");
return;
}
SubSort(arr, 0, arr.length - 1); // 分治
}
@Test public void testQuickSort() { 
  int[] arr = {9,9,-1,-2,-1,5};
  System.out.println(
"排序前:" + Arrays.toString(arr));
  QuickSort(arr);
  System.out.println(
"排序后:" + Arrays.toString(arr));
}
}

 

posted @ 2021-03-16 15:51  Peterxiazhen  阅读(70)  评论(0编辑  收藏  举报