目录
快速排序的基本思想:
- 从序列的两端开始“探测”,用两个变量i、j分别指向序列的低端和高端
- 若i所指的元素小于等于j所指的元素,则j前移
- 若i所指元素大于j所指元素,则将i和j中的元素进行交换,且i后移
- 重复以上操作,直至i=j时,找到轴值所在位置(值得注意的是:找到轴值以后,轴值左边的元素均小于等于轴值,轴值右边的元素均大于等于轴值)
左半段,且都比轴值小或等 | 轴值pivot | 右半段,且都比轴值大或等 |
java代码:
int Partition(int r[],int first,int end) { //划分,找轴值
int i=first,j=end; //初始化待划分的区间,i指向数组第一个元素的位置,j指向最后一个
while(i<j) { //当i>=j,说明已找到轴值的位置
while(i<j && r[i]<=r[j]) j--; //从右侧开始向前扫描
if(i<j) { //进行if语句的条件是i所指元素>j所指元素,即后者小于前者(前者大于后者)
int temp=r[i];r[i]=r[j];r[j]=temp; //将较小元素交换放在前面
i++; //i向后移
}
while(i<j && r[i]<=r[j]) i++; //从左侧开始向后扫描
if(i<j) { //前者大于后者
int temp=r[i];r[i]=r[j];r[j]=temp; //将较大元素交换放在后面
j--; //j前移
}
}
return i; //返回轴值的位置
}
void QuickSort(int r[],int first,int end) {//快速排序
int pivot; //轴值
if(first<end) { //若first==end,则说明序列中只有一个元素,有序
pivot=Partition(r,first,end);//调用Partition函数找到轴值所在位置
QuickSort(r,first,pivot-1); //求解子问题1,对轴值左边进行快速排序
QuickSort(r,pivot+1,end); //求解子问题2,对轴值右边进行快速排序
}
}