快速排序
快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。所以快速排序是一个不稳定的排序方法。网上也有基于快速排序的改进方法,时间复杂度有所降低,这里我们不在赘述,有兴趣大家可以去查一下。
首先说一下快排的基本思想,并不难理解。
- 选择一个基准元素,通常选择第一个元素或者最后一个元素(理论上随便选即可)。
- 通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大
- 此时基准元素在其排好序后的正确位置
- 然后通过递归方法分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。
public class kuaisu {
public static void main(String[] args) {
int a[]={2,6,8,4,1,16,24,12};
QuickSort(a, 0, a.length-1);
print(a);
}
public static void QuickSort(int a[],int left,int right) {
if(left>right) return;
int pivot=a[left];//将a[left]作为基准
int i=left;
int j=right;
while(i<j) {
while(a[j]>=pivot&&i<j) {
j--; //从右向左寻找小于pivot的数
}
a[i]=a[j]; //找到小于pivot的数后跳出while循环,将a[j]的数放于a[i]处,即将小于基准pivot的数放在左边
while(a[i]<=pivot&&i<j) {
i++; //从左向右寻找大于pivot的数
}
a[j]=a[i]; //找到大于pivot的数后跳出while循环,将a[i]的数放于a[j]处,即将大于基准pivot的数放在右边
}
a[i]=pivot; //当最外层的while循环完毕,必有i==j,此时的i位置即为pivot的正确位置
QuickSort(a, left, i - 1); // 将right置为i位置左边一位i-1,递归处理i左边的数字序列
QuickSort(a, i+1, right);//同上理
}
public static void print(int a[]) {
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
}
}
时间复杂度:O(nlog2n)
空间复杂度:O(nlog2n)
不稳定