手把手带你认识快速排序(二)——实现
上篇写了下对快速排序的一个简单认识。但是,我个人是比较喜欢代码的,总感觉说的再好,不如看代码爽,下面我就给大家看一下快速排序的代码,我是用的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 whilearray[l]=tempRecord;return l;} }- 2楼lfmilaoshi4小时前
- 把很多的排序,统一到一个方法,如何n米老师
- 1楼lidaasky昨天 21:21
- 犀利