一、基本思想
- 从数列中取一个元素,作为 “基准”(pivot);
- 分区——遍历数组,将所有元素与基准值比较,小于基准值的放在基准前面,大于基准值的放在基准后面(等于基准值的可以到任一边)。一次分区完成后,该基准就位于数列的中间位置;
- 递归对两个区的子数列进行排序,直至子数列的长度为 1。
二、代码实现
public int[] quickSort(int[] sourceArray){
int[] array = Arrays.copyOf(sourceArray, sourceArray.length);
return sort(array, 0, array.length - 1);
}
private int[] sort(int[] array, int left, int right){
if(left < right){
int partitionIndex = partition(array, left, right);
sort(array, left, partitionIndex - 1);
sort(array, partitionIndex + 1, right);
}
return array;
}
private int partition(int[] array, int left, int right){
int pivot = left;
int index = pivot + 1;
for (int i = index; i <= right; i++) {
if(array[i] < array[pivot]){
swap(array, i, index);
index++;
}
}
swap(array, pivot, index - 1);
return index - 1;
}
private void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}