算法基础-快速排序

要求:10分钟内写出快排!

之前笔试用到排序算法,总是想用快排但是又不能在规定时间写出来,归根到底还是快排的逻辑步骤没有搞清,所以才导致每次失败!彻底搞清快排动作逻辑,这样即使长时间不用也能临时写出来!

思路:

1. 就像选择排序每排一次序排好最小/大值一样,快速排序每排一次序 会 将中轴值(默认取数组第一个)排好,并且中轴值之前的都是小于它的,中轴值之后都是大于它的。这样 中轴值之前(arr,low,middle-1)/中轴值之后(arr,middle+1,high)  作为新的数组又能进行快速排序,直到数组个数为1。

public void _quickSort(int() arr,int low,int high) {

    if(low < high) { //数组个数不为1

        int middle = getMiddle(arr,low,high); //快速排序排一次序   

        _quickSort(arr,low,middle-1);

        _quickSort(arr,middle+1,high);

    }

}

2.     每次排序的逻辑是: 将数组的第一个元素(选取的中轴值)放到它应该处的位置并返回它排完序后下标。比他大的要放在他后面,比他小的放在他前面。

我们将中轴值拿出来,从后往前找,while(arr[high]>tmp) high-- ;直到遇到比中轴值小的,arr[low] = arr[high];将小的值赋值到中轴值前面;接着暂停从后往前找,开始从前往后找,while(arr[low]<tmp) high++;直到遇到比中轴值大的,arr[high]=arr[low]; 如此交替循环(这样防止了值的覆盖),直到 low == high;而此时low/high就是中轴值的下标,arr[low]=tmp;

private int getMiddle(int[] arr,int low,int high) {

    int tmp = arr[low];    

    while(low< high) {

        while(low < high && arr[high]>tmp) high --;

        arr[low]=arr[high];

        while(low<high && arr[low]<tmp) low++;

        arr[high] = arr[low];

       }

    arr[low]=tmp;

    return low;

}

 

综上:我们的快排就写好啦!

public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {32,43,1,344,63,12,34,444,2,3,32,54};
int[] arr2 = {5};
QuickSort qs = new QuickSort();
qs.quickSort(arr2);
for(int i : arr2) {
System.out.print(i+" ");
}
}
public void quickSort(int[] arr) {
if(arr.length>0) { //查看数组是否为空
_quickSort(arr,0,arr.length-1);
}
}
private void _quickSort(int[] arr,int low,int high) {
if(low < high) {
int middle = getMiddle(arr,low,high);
_quickSort(arr,low,middle-1);
_quickSort(arr,middle+1,high);
}
}
//快排的 单次排序: 中轴值 不是 中间值,它返回的是 你随机(数组第一个)的中轴值在排完序后的坐标
private int getMiddle(int[] arr,int low,int high) {
int tmp = arr[low]; // 数组中的第一个 作为 中轴
while(low < high) { 
while(low<high && arr[high] >= tmp) {
high--;
}
arr[low] = arr[high]; //将 比中轴小的值 移到低端
while(low<high && arr[low] <= tmp) {
low++;
}
arr[high]=arr[low]; //
}
//low == high
arr[low] = tmp;
return low;
}
}





猜你喜欢

转载自blog.csdn.net/qq_26295547/article/details/80077967