快速排序算法

时间:2021-11-14 12:38:01

快速排序算法是一种较为高效的排序算法,采用了“挖坑填数+分而治之”的思想。该算法的时间复杂度最好时为O(nlogn),最差时为O(n^2),空间复杂度为O(logn),也是不稳定的,适合n值较大的排序任务。

该算法的基本思想是:每次排序都找一个基准位,使得基准位前端的部分每个数都小于该基准位上的数,基准位后端的部分每个数都大于该基准位上的数,然后递归该过程,知道待排序序列中的所有元素都有序为止。

快速排序算法的一种实现如下(Java版):

 1 /**
 2  * 快速排序(挖坑填数+分治法)
 3  * @author JiaJoa
 4  * 通过查找一个待排序的序列中的一个基准位置(一般以第一个数为基准),
 5  * 使得基准左边的都小于这个基准,基准右边的都大于这个基,
 6  * 然后使用递归等方法对左右两边执行同样的快速排序
 7  *
 8  */
 9 public class Algorithm_QuickSort {
10     public static void main(String[] args){
11         int[] data = new int[]{7,1,6,4,3,2,1,23};
12         
13         Algorithm_QuickSort.quickSort(data); 
14     }
15     
16     //第一步,查找一个基准位
17     public  static int getPart(int low,int high,int[] data){
18         
19         int comData = data[low]; //设定一个初始基准
20         while(low<high){
21             while(low<high&&data[high]>=comData){//从右向左查找
22                 high--;
23             }
24             if(low<high){
25                 data[low] = data[high]; //小于基准的移到低端
26             }
27             
28             while(low<high&&data[low]<=comData){ //从左向右查找
29                 low++;
30             }
31             if(low<high){
32                 data[high]=data[low]; //大于基准的移到高端
33             }
34         }
35         data[low] = comData; //基准位置不再变化时
36         return low;
37     }
38     
39     //第二步,采用递归的方式处理基准左右两堆
40     public static void quick_Recursion(int low,int high,int[]data){
41         
42         int base;
43         if(low<high){
44             base = getPart(low,high,data);//获取基准
45             quick_Recursion(low,base-1,data);//对低基准位段进行递归排序
46             quick_Recursion(base+1,high,data);//对高基准位段进行递归排序
47         }
48     }
49     
50     //第三步,打印排序的序列
51     public static void quickSort(int[] data){
52         quick_Recursion(0,data.length-1,data);
53         
54         StringBuilder playnum = new StringBuilder();
55         for(int i : data){
56             playnum.append(i+",");
57         }
58         System.out.println(playnum.toString());
59     }
60 }