JAVA算法-快速排序

来源:互联网 发布:js两个对象数组合并 编辑:程序博客网 时间:2024/05/29 18:45

快速排序算法

快速排序算法原理:
个人理解,快速排序算法就是一个不断重复的二分法,将一个数组或列表分成两部分,选择一个基准元素,令左侧部分都比这个基准元素小,右侧部分都比基准元素大。然后对左右两部分递归调用,不断循环,从而得到一个有序的数组。

例如:有一个int数组{ 49, 38, 65, 97, 76, 13, 27, 50 }
1、首先选取第一个元素作为基准元素。index = 49
2、先从右向左顺序比对,只要遇到比49小的,就将49这个位置替换掉,然后调换顺序,从左向右开始比对。
3、从左向右顺序比对时,只要遇到比49大的,将上次替换者的位置替换掉,然后调换比对顺序。

执行步骤:
1、从后向前比对,遇到27 < 49时第一次替换。然后调换比对顺序
{ 27, 38, 65, 97, 76, 13, 27, 50 }
2、从前向后比对,遇到65 > 49,然后替换刚刚27的位置,调换顺序。
{ 27, 38, 65, 97, 76, 13, 65, 50 }
3、遇到13 < 49 替换刚刚65的位置,调换顺序
{ 27, 38, 13, 97, 76, 13, 65, 50 }
4、遇到97 > 49 替换刚刚13的位置,调换顺序
{ 27, 38, 13, 97, 76, 97, 65, 50 }
这时已经循环完毕后,将最后的替换者97 ,用49替换。
{ 27, 38, 13, 49, 76, 97, 65, 50 }

到现在一次二分循环就完成了。得到49左侧的都比49小,右侧的都比49大。
然后进行递归调用,将 {27, 38, 13}和{ 76, 97, 65, 50 }分别通过上述方法进行二分,最后全部循环完毕时就可以得到一个有序的数组。

具体代码如下:

public static void main(String[] args) throws Exception {    int[] a = { 49, 38, 65, 97, 76, 13, 27, 50 };    // 传递数组,low表示要进行二分的起始位置,high表示结束位置    sort(a, 0, a.length-1);    for (int v : a) {        System.out.print(v + " ");    }}public static void sort(int a[], int low ,int high){        int i = low;        int j = high;        int index = a[i];        if (low >= high){            return;        }        while (i<j){            if (i<j && a[j] >= index){                j--;            }            if (i<j){                a[i++] = a[j];            }            if (i<j && a[i] <= index){                i++;            }            if (i < j){                a[j--] = a[i];            }        }        a[i] = index;        sort(a,low,i-1);        sort(a,i+1, high);    }
原创粉丝点击