手把手带你认识快速排序(2)——实现
手把手带你认识快速排序(二)——实现
上篇写了下对快速排序的一个简单认识。但是,我个人是比较喜欢代码的,总感觉说的再好,不如看代码爽,下面我就给大家看一下快速排序的代码,我是用的java写的。
public class QuickSort { public static void main(String[] args)throws Exception{ int[] a={5,6,4,1,2,3,7,8,9}; Sort(a,0,8); for(int i=0; i<a.length; i++){ System.out.println(a[i]); } } //利用递归进行排序 public static void Sort(int[] array, int left, int right) { if(right<=left) //如果自写中只有0或1个记录,就不需排序 return; int pivot=SelectPivot(left,right); //选择轴值 Swap(array,pivot,right); //分割前,将轴值换到末端(初端也可以) pivot=Partition(array,left,right); //获取分割后,轴值所在的位置 Sort(array,left,pivot-1); //对左子序列进行递归快速排序 Sort(array,pivot+1,right); //对右子序列进行递归快速排序 } //交换数组中的两个元素 private static void Swap(int[] array, int index1,int index2) { int tmp=array[index1]; array[index1]=array[index2]; array[index2]=tmp; } //选择轴值 private static int SelectPivot(int left,int right) { return (left+right)/2; //选取中间记录作为轴值,提取出来,方便日后修改 } //分割函数,返回分割后轴值所在的位置 private static int Partition(int[] array, int left, int right) { int l=left; int r=right; int tempRecord=array[r]; while(l != r){ //当l与r相遇时,推出循环 //模拟左指针l的操作,l指针向右移动,越过比轴值小的数,直道找到一个大于轴值额记录 while(array[l] <= tempRecord && r>l) l ++; //在l与r未相遇之前,将比轴值大的数放到右边,如果再次进行交换,那么会增加两条语句,再加上下面的,一共会增加4条语句。这个对于一个为大数组而设计的快速排序来说,这个伤我感觉还是比较大的 if(l<r) { array[r] = array[l]; r --; } //模拟右指针r的操作,r指针向左移动,越过比轴值大的数,直道找到一个小于轴值额记录 while(array[r] >= tempRecord && r>l) r--; //在l与r未相遇之前,将比轴值小的数放到左边 if(l<r){ array[l]=array[r]; l++; } } //end while array[l]=tempRecord; return l; } }
- 2楼lfmilaoshi4小时前
- 把很多的排序,统一到一个方法,如何n米老师
- 1楼lidaasky昨天 21:21
- 犀利