算法之快速排序

  • 基本概念

快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立的排序。当两个数组都有序时整个数组也就自然有序了。在快速排序中,切分的位置取决于数组的内容。切分的关键在于使数组满足下面三个条件:
1. 对于某个下表j,数组[j]的位置已经选定;
2. 数组[0]到数组[j-1]中的所有元素都不大于数组[j];
3. 数组[j+1]到数组[length-1]的所有元素都不小于数组[j]

我们一般通过递归地调用切分来排序。具体的切分方法是随意地选取数组[x]作为切分元素,即那个将会被排定的元素,然后我们从数组的左端开始向右扫描直到找到一个大于等于它的元素,再从数组的右端开始向左端扫描直到找到一个小于等于它的元素。这两个元素显然没有排定,因此我们交换它们的位置。如此继续,就可以保证左指针i的左侧元素都不大于切分元素,右指针j的右侧元素都不小于切分元素。当两个指针相遇时,我们只需要将切分元素数组[x]和左子数组最右侧的元素交换然后返回下标就可以了。

  • 代码实现
public class Quick {

    public static void Sort(int[] arr) {//使用sort方法传递一个数组,并调用method()方法
        method(arr,0,arr.length-1);
    }

    private static void method(int[] arr, int first, int last) {//method()方法,定义两个索引
        if(last <= first) {//当前后两个索引相交时,停止排序
            return;
        }
        int number = getNumber(arr,first,last);//获取切分点
        method(arr,first,number - 1);//以切分点为界,左边的数组进行排序
        method(arr,number + 1, last);//以切分点为界,右边的数组进行排序
    }

    private static int getNumber(int[] arr, int first, int last) {//获取切分点
        int i = first; 
        int j = last + 1;//获取数组两边的指针(即从两边开始移动)
        int choice = arr[first];//把第一个元素的值定义为切分点

        while(true) {

            while(arr[++i] <= choice) {//当左边的数小于切分点,继续运行
                if(i == last) {//当左边的数大于切分点时,跳出循环
                    break;
                }
            }
            while(choice <=  arr[--j]) {//当右边的数大于切分点,继续运行
                if(j == first) {//当右边的数小于切分点时,跳出循环
                    break;
            }
            }
            if(i >= j) {//两者相交时退出方法
                break;
            }
            int temp = arr[j];//调换位置
            arr[j] = arr[i];
            arr[i] = temp;


        }

        int temp2 = choice;//把切分点移动中间
        arr[first] = arr[j];
        arr[j] = t   emp2;



        return j;
    }

}
点赞