yang哥

博客园 首页 新随笔 联系 订阅 管理

排序-快速排序

基本思想: 将数据划分为两部分,左边的所有元素都小于右边的所有元素;然后,对左右两边进行快速排序。

划分方法: 选定一个参考点(中间元素),所有元素与之相比较,小的放左边,大的放右边。

具体步骤: 选择第一个元素作为中间元素。

(1)先保存该元素的值到其它位置,腾出其空间。

(2)从后往前搜索一个比中间数小的元素,并将其放置到前面的这个空位上。

(3)从前往后搜索一个比中间数大的元素,并将其放置到后面的这个位置上。

重复(2),(3),直到两边搜索的空位重合,此时将中间元素放在该空位中。

平均时间:O(nlogn)

最好情况:O(nlogn)

最坏情况:O(n2)

辅助空间:O(logn)

稳定性:不稳定

适用场景:n比较大时

代码实现:

 1   public static void quickSort(int[] list){
 2         quickSort(list, 0, list.length-1);
 3     }
 4     private static void quickSort(int []list,int left,int right){
 5         int cutPoint = 0;
 6         if(left < right){
 7             cutPoint = partion(list,left,right);
 8             quickSort(list, left, cutPoint-1);
 9             quickSort(list, cutPoint+1, right);
10         }
11     }
12 
13     private static int partion(int []list, int left, int right) {
14         int cutPointValue = list[left];
15         while(left != right){
16             while(left < right && cutPointValue < list[right])right--;
17             if(left < right){
18                 list[left] = list[right];
19                 left++;
20             }
21             
22             while(left < right && cutPointValue > list[left])left++;
23             if(left < right){
24                 list[right] = list[left];
25                 right--;
26             }
27         }
28         list[left] = cutPointValue;
29         return left;
30     }

 

posted on 2015-10-05 11:05  woniuyang  阅读(497)  评论(0编辑  收藏  举报