之前学习数据结构的时候了解了一下快排,但后面没怎么用就慢慢忘记了,于是现在就写个博客回顾一下。
快排实际上是对冒泡排序的一中改进,基本思想在于划分。基本有以下几个步骤
1.初始关键字序列,设定两个指针,指针i指向第一个元素,指针j指向最后一个关键字
2.从指针j开始,向前检查每个关键字,直到发现小于划分元素为止
3.把元素移动到指针i所指的位置
4.移动完元素后,把指针i往后移动一个位置。
5.从指针i开始,向后检查每个关键字,直到发现大于划分的元素为止
6.把元素移动到指针j所指的位置,并把指针j往前移动一个元素
7.继续重复第二步,当i和j指向同一个元素,则划分结束
8.继续对目标元素左边和右边进行排序。
代码如下
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] qs = {8,9,2,3,5,4,8,6,2,1};
System.out.println(Arrays.toString(qs));
System.out.println();
//快排
quickSort(qs,0,qs.length-1);
System.out.println(Arrays.toString(qs));
}
/**
*
* @param qs 待排序的数据
* @param i 待排序首元素下标
* @param j 待排序尾元素下标
*/
private static void quickSort(int[] qs, int i, int j) {
if(qs.length==0) return ; //判断
int k ;
if(i<j) { //递归出口
k = partition(qs, i, j); //调用划分函数,把序列分成两部分
quickSort(qs, i, k - 1); //对前部分进行快速排序
quickSort(qs, k + 1, j); //对后部分进行快速排序
}
}
/**
*
* @param a 待排序得数组
* @param i 待排序首元素下标
* @param j 待排序尾元素下标
* @return
*/
private static int partition(int[] a, int i, int j) {
int temp = a[i]; //选择首元素为划分元素
while(i<j){ //根据步骤2,当i>=j时候结束本次划分
while (a[j]>=temp&&i<j) j--; //从后往前找到第一个小于划分元素的元素
if(i<j) a[i++] = a[j]; //找到则移动元素,并把下标i增加1
while ((a[i]<=temp&&i<j)) i++; //从前往后找到第一个大于划分元素的元素
if(i<j) a[j--] =a[i]; //找到则移动元素,并把下标j减1
}
a[i] = temp; //划分结束,最后设置把划分元素置于目标位置
return i; //返回划分元素所在下标
}
}
最后总结一下
快排时间复杂度O(nlog2^n) 最坏情况为O(n^2)