java快速排序

来源:互联网 发布:centos apache配置 编辑:程序博客网 时间:2024/06/16 23:38

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]
请按任意键继续. . .

原创粉丝点击