快速排序算法


快速排序算法是一種較為高效的排序算法,采用了“挖坑填數+分而治之”的思想。該算法的時間復雜度最好時為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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM