1、此算法平均时间复杂度:O(nlog2n)
是目前基于比较的内部排序中被认为是最好的一种排序算法。当待排序的关键字是随机分布时,快速排序的平均时间最短。
2、空间复杂度:O(log2n)
3、不稳定排序算法
下面举例说明为何快速排序是一种不稳定排序算法:
0 1 2 3 4 5 6(位号)
4 2 1 6 3 5 3
支点=4
此时先4和3比较,于是3被放到0号位
支点再和2、1比较,都小于4,所以2、1位置不变。
支点和6比较,小于6,所以将6放到了6号位(此号位上的3被移到了0号位),将4放到3号位。
一轮下来的结果:3 1 2 3 4 5 6
此时,两个相等数3的相对位置就变换了,所以称此算法为不稳定算法。
具体代码:
import java.util.Arrays;
public class QuickSort {
/**
* 快速排序
*
* 思路:
* 1、目标支点定位:拿初始支点和两端数据交替的进行比较。
每一轮adjust()下来,目标支点左边的数值比支点小,右边的数值大于等于支点。
* 2、左右再分别进行目标支点的定位。
*
* 全部目标支点都找到时,即排序完成。
*
*/
public static void main(String[] args) {
int[] arr = {3,1,3,2,4,2,3};
sort(arr, 0, arr.length-1);
//sort(arr, arr.length-1, 0);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr, int low, int high) {
if(low < high) {//low>=high的情况无意义
int pivotPosition = adjust(arr, low, high);//支点定位
sort(arr, low ,pivotPosition-1);//支点左边递归定位
sort(arr, pivotPosition+1, high);//支点右边递归定位
}
}
//支点定位
public static int adjust(int[] arr, int low, int high) {
int pivot = arr[low];//初始支点为low位上数
while(low < high) {
while(low<high && compare(pivot, arr[high]) <= 0) { //支点和高位比,比高位小,就high自减继续比。
high--;
}
arr[low] = arr[high]; //支点比高位大时,就将高位放到low位
while(low<high && compare(pivot, arr[low]) > 0) { //再将支点和低位比较,比低位数大,low 自增继续比
low++;
}
//找到比支点大的低位,就将此低位数放到此时的high位上。
arr[high] = arr[low];
arr[low] = pivot;//将支点放在此时的low位置
}
System.out.println("支点:"+arr[low]);
return low;
}
//数值比较
public static int compare(int num1, int num2) {
return num1-num2;
}
}
//结果:
支点:3
支点:2
支点:4
支点:3
[1, 2, 2, 3, 3, 3, 4]
请按任意键继续. . .