前言
快速排序由C. A. R. Hoare在1962年提出。
1. 什么是快速排序算法?
快速排序算法是对冒泡排序算法的一种改进,没有冒泡排序两两相邻之间的比较换位,主要采用的思想是通过递归+独立排序的形式将无序的数列进行分割成可以独立排序的2部分数列,其中一部分数列比另外一部书数列小,每次排序两个独立的数列,直到排序完毕,即可完成最终的排序。
简单讲就是每次定义一个临界值,将大值放在临界值的右边,小值放到临界值的左边。
2. 快速排序的实现步骤
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
具体思路:
选择一个基点,通过不断的判断,将比基点大的数放在右边,比基点小的数放在左边,接下来进行递归
代码思路如下:
public class QuickSort {
public static void swap(int[] arr, int index1, int index2)
{
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
public static void quicksort(int []arr,int start,int end)
{
if(arr != null && arr.length > 0){
int jishu;
int s=start;int e=end;
jishu=arr[start];
while(s<e){
/*************************************/
while(s<e){//从右向左比较,如果右边的比基数大责交换,否则e--继续右边-1比较
if(arr[e]<jishu){
swap(arr,s,e);
break;
}
else{
e--;
}
}
/**************************************/
while(s<e){//从左向右比较,如果左边的比基数大责交换,否则S++继续左边+1比较
if(arr[s]>jishu){
swap(arr,s,e);break;
}
else {
s++;
}
}
/******************************************/
//第一个基数排好位置左边的比基数小,右边的比基数大,但是两边不一定按顺序,接着对左右-1递归
if((s-1>start)){
quicksort(arr,start,s-1);
}
if(e+1<end){
quicksort(arr,e+1,end);
}
}
}
}
}
复杂度分析
排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | 复杂性 | ||
平均情况 | 最坏情况 | 最好情况 | ||||
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(log2n) | 不稳定 | 较复杂 |