上篇写了下对快速排序的一个简单认识。但是,我个人是比较喜欢代码的,总感觉说的再好,不如看代码爽,下面我就给大家看一下快速排序的代码,我是用的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;
}
}