快速排序
大致步骤如下:
首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。
将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部分中各个数据元素都小于分界值,而右边部分中各数据元素都大于或等于分界值,且右边部分个数据元素皆大于左边所有数据元素。
然后,左边和右边的数据可以看成两组不同的部分,重复上述1和2步骤
当左右两部分都有序时,整个数据就完成了排序。
public class QuickSort {
public static void main(String[] args) {
int[] array = {30,20,40,60,11,25,40};
int low = 0,high = array.length - 1;
quickRow(array,low,high);
for (int i : array){
System.out.println(i);
}
}
//快排方法
public static void quickRow(int[] array, int low, int high){
int i,j,pivot;
//结束条件
if (low >= high) {
return;
}
i = low;
j = high;
//选择的节点,这里选择的数组的第一数作为节点
pivot = array[low];
while (i < j){
//从右往左找比节点小的数,循环结束要么找到了,要么i=j
while (array[j] >= pivot && i < j){
j--;
}
//从左往右找比节点大的数,循环结束要么找到了,要么i=j
while (array[i] <= pivot && i < j){
i++;
}
//如果i!=j说明都找到了,就交换这两个数
if (i < j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
//i==j一轮循环结束,交换节点的数和相遇点的数
array[low] = array[i];
array[i] = pivot;
//数组“分两半”,再重复上面的操作
quickRow(array,low,i - 1);
quickRow(array,i + 1,high);
}
}