public class QuickSort {
/**
* 快速排序
*选定一个数作为其关键字,把小于此关键字的放在左边,大于此关键字的放在右边,依次递归,最后都变成有序的
*一次快速排序的算法过程:
*1.选择器关键字,用两个变量lo,hi记录从开始和末尾扫描的位置
*2.从后往前扫面
*3.从前往后扫描
*直到lo>=hi时,一次排序技术
*迭代以上步骤,直到整个数组都有序
*/
//因为快速排序是采用迭代的方法执行的,所以把快速排序的一次排序提出来写成一个方法
public static int quick(int lo,int[] a,int hi){
//默认选择开始元素为关键字
int key=a[lo];
while(lo<hi){
//先扫描后半部分
while(key<a[hi]&&lo<hi){
hi--;
}
a[lo]=a[hi];
//扫描前半部分
while(key>a[lo]&&lo<hi){
lo++;
}
a[hi]=a[lo];
}
a[hi]=key;
return hi; //为什么返回hi了,因为hi是存储key值的位置,
}
//采用迭代直到每个都有序
public static void quickIteration(int lo, int[] a,int hi){
if(lo>=hi)
return;
int partitionPoint = quick(lo, a, hi);
//前面半部分迭代
quickIteration(lo, a,partitionPoint-1);
//后半部分迭代
quickIteration(partitionPoint+1, a,hi);
}
public static void main(String[] args) {
int[] a={12,2,1,13,4,21,45,6};
quickIteration(0,a,7);
System.out.println(Arrays.toString(a));
}
}
时间复杂度为:O(NlogN)
快速排序的算法改进
1.对于小数据量的排序,快速排序并不比插入排序快
一般hi<lo+M 采用插入排序,M的值一般为5 —— 15,否则采用快速排序
2.
快速排序的时间复杂度和关键字的选取有很大的关系,快速排序选取关键字有三种方法:固定切分,随机切分,三取样切分,一般情况下,三取样切分是效率最高的,三数去中就是取开始元素,结束元素,中间元素的中间值作为key关键字
public class QuickSort {
/**
* 快速排序
*选定一个数作为其关键字,把小于此关键字的放在左边,大于此关键字的放在右边,依次递归,最后都变成有序的
*一次快速排序的算法过程:
*1.选择器关键字,用两个变量lo,hi记录从开始和末尾扫描的位置
*2.从后往前扫面
*3.从前往后扫描
*直到lo>=hi时,一次排序技术
*迭代以上步骤,直到整个数组都有序
*/
//因为快速排序是采用迭代的方法执行的,所以把快速排序的一次排序提出来写成一个方法
public static int quick(int lo,int[] a,int hi){
//三数取样法选取关键字
int mid=lo+(hi-lo)/2;
if(a[mid]>a[hi]){
swap(a[mid],a[hi]);
}
if(a[lo]>a[hi]){
swap(a[lo],a[hi]);
}
if(a[mid]>a[lo]){
swap(a[mid],a[lo]);
}
int key=a[lo];
while(lo<hi){
//先扫描后半部分
while(key<a[hi]&&lo<hi){
hi--;
}
a[lo]=a[hi];
//扫描前半部分
while(key>a[lo]&&lo<hi){
lo++;
}
a[hi]=a[lo];
}
a[hi]=key;
return hi; //为什么返回hi了,因为hi是存储key值的位置,
}
//采用迭代直到每个都有序
public static void quickIteration(int lo, int[] a,int hi){
if(lo>=hi)
return;
int partitionPoint = quick(lo, a, hi);
//前面半部分迭代
quickIteration(lo, a,partitionPoint-1);
//后半部分迭代
quickIteration(partitionPoint+1, a,hi);
}
//两个数交换
public static void swap(int x,int y){
int temp=x;
x=y;
y=temp;
}
public static void main(String[] args) {
int[] a={12,2,1,13,4,21,45,6};
quickIteration(0,a,7);
System.out.println(Arrays.toString(a));
}