快速排序
1.快速排序的基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序的具体算法步骤:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
2.partition算法解析
partition算法使用头尾两个方向相反的指针进行遍历,先将数组第一个元素设置为比较元素,头指针从左至右找到第一个大于比较元素的数,尾指针从右至左找到第一个小于比较元素的数,全部交换完毕后将比较元素放到中间位置。

代码的实现:
//快速排序partition实现方法 public class T2 { public static void main(String args[]) { int a[] = {5,7,1,6,4,8,3,2}; quicksort(a, 0, a.length-1); for(int i=0;i<a.length;i++) System.out.print(a[i] + " "); System.out.println(); } public static void swap(int a[], int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } //划分数组 public static int partition(int a[], int low, int high) { int x = a[low]; //将该数组第一个元素设置为比较元素 int i=low; int j=high; while(i < j) { while(i<j && a[j] >= x) j--; //从右至左找到第一个小于比较元素的数 while(i<j && a[i] <= x) i++; //从左至右找到第一个大于比较元素的数 /*需要注意的是,这里的j--与i++的顺序不可以调换! *如果调换了顺序,i会走过头,以至于将后面较大的元素交换到数组开头*/ //将大数与小数交换 if(i!=j) swap(a, i, j); } swap(a, i, low); //将比较元素交换到期望位置 return i; //返回比较元素的位置 } public static void quicksort(int a[], int low, int high) { if(low < high) { int i = partition(a, low, high); //划分数组并获取比较元素的位置 quicksort(a, low, i-1); //对比较元素左边进行排序 quicksort(a, i+1, high); //对比较元素右边进行排序 } } }

浙公网安备 33010602011771号