【快速】排序, T(n) = O(nlgn),O(n^2) S(n) = O(lgn) --- 不稳定

 1   public static void quickSort(RS[] arrRS,int low,int high){
 2         
 3         // 保存【分割点】
 4         int partition;
 5         
 6         // 【段长】大于1
 7         if(low < high){
 8             
 9             // 一次分割,获得【分割点】 和  两个【子段】
10             partition = quickPartition(arrRS,low,high);    
11             
12             //【递归】两个子段
13             quickSort(arrRS, low,           partition-1);
14             quickSort(arrRS, partition+1, high);
15         }
16   }
17 
18   //分割
19   private static int quickPartition(RS[] arrRS, int left, int right) {
20         
21         // 拿起左边第一个,作【标尺】
22         RS tempRS = arrRS[left];
23         
24         // 【段长】大于1,未结束
25         while (left < right) {
26             
27             /*################  左     <<===   右  ##################*/
28             while (left < right && arrRS[right].val>=tempRS.val) {
29                 right--;
30             }
31             if (left < right) {  // 若未结束,右边大的,放到左边 left 索引处,left 右移
32                 arrRS[left] = arrRS[right];
33                 left ++;
34             }
35             
36             /*################  左      ===>>   右  ##################*/
37             while (left < right && arrRS[left].val<tempRS.val) {
38                 left++;
39             }
40             if (left < right) {  // 若未结束,左边小的,放到右边 right 索引处,right 左移
41                 arrRS[right] = arrRS[left];
42                 right --;
43             }
44             
45         }
46         
47         // 【标尺】归【分割点】
48         arrRS[left] = tempRS;
49         
50         // 返回分割点
51         return left;
52     }

 

posted @ 2013-12-14 20:03  聆听自由  阅读(307)  评论(0编辑  收藏  举报