交换类排序——快速排序
快速排序是从序列中选择一个比较对象,然后其他的元素与它比较分成两组,按照相同的方法在两组中以此划分,直到以两个数为一组。就像递归函数一样。
//快速排序 public class QuickSort { public void quickSort(int[] r,int low,int high) { if(low<high) { int pa=partition(r,low,high); if(pa-1>low) quickSort(r,low,pa-1);//将pa左边的序列排序 if(pa+1<high) quickSort(r,pa+1,high);//将pa右边的序列排序 } } private int partition(int[] r,int low,int high) { int privot=r[low];//选择比较对象,选择的对象直接影响到排序的效率,以中间数最好 while(low<high) { while(low<high && r[high]>=privot)//从右边向左扫描,找到第一个比privot小的数向前移,否则元素不动指针前移 high--; if(low<high) r[low]=r[high]; while(low<high && r[low]<=privot)//从左向右移…… low++; if(low<high) r[high]=r[low]; } r[low]=privot;//中间数填回最后移动的位置 return low; } public static void main(String[] args) { QuickSort b=new QuickSort(); int[] a={4,8,3,6,9,7,5,2,1}; b.quickSort(a,0,8); for(int i=0;i<a.length;i++) System.out.println(a[i]); } }
影响快速排序效率的是比较元素的选择问题如果每次分组后,两个组的元素个数差不多,效果最好。因此选择比较对象元素师关键。