07快速排序
基本思想:选取任一元素,将小于它的放前面,大于它的放后面,对子序列重复此步骤。
讲解:
//创建一个名为Quick_sort的驱动函数,传入待排序数组及其大小
public static void Quick_sort(int a[],int len){
//调用分区函数,传入带排序数组a,起始位置0,结束位置len - 1
Qsort(a,0,len - 1);
}
//创建一个名为Qsort的分区方法,需要传入一个待排序数组a,左边界low,右边界high
public static void Qsort(int a[],int low,int high){
//判断左边界是否小于右边界,若是
if(low < high){
//调用Partition方法,将数组分段并拿到基准元素
int pivot = Partition(a,low,high);
//对基准元素的前半段递归
Qsort(a,low,pivot - 1);
//对基准元素的后半段递归
Qsort(a,pivot + 1,high);
}
}
//创建一个名为Partition的方法,需要传入待排序的数组、左边界lwo,右边界high
public static int Partition(int a[],int low,int high){
//定义pivotkey为基准元素,让第一个元素a[low]为基准元素
int pivotkey = a[low];
//while循环条件:左边界小于右边界
//while每次循环都将左半区大于基准值的放到右边,右半区小于基准值的放到左边
while(low < high){
//从右向左找出第一个小于基准元素的元素下标high
while(low < high && a[high] >= pivotkey){
high--;
}
//让a[low]的值为此时的a[high]
a[low] = a[high];
//从左向右找出第一个大于基准元素的元素下标low
while(low < high && a[low] <= pivotkey){
low++;
}
//让a[high]的值为此时的a[low]
a[high] = a[low];
}
//将基准元素拿到当前指针low所指向的位置
a[low] = pivotkey;
//最终返回这个low值,即基准元素的索引
return low;
}