排序算法(三)

 1 /**
 2  * 03/09/2014
 3  * 
 4  * @author Burke
 5  *
 6  */
 7 public class Sort {
 8 
 9     public static void main(String[] args) {
10         int[] source = {4, 2, 1, 6, 3, 6, 0, -5, 1, 1};
11         dichotomySort(source);
12         for (int i = 0; i < source.length; i++) {
13             System.out.print(source[i] + " ");
14         }
15     }
16     
17     /*
18      * 二分排序:就是插入排序法的一种修改,当a[0],a[1]...a[i-1]排好序,
19      * 寻找第i个元素在其中的位置时采用二分查找法,于是该算法称二分排序法,
20      * 所以我认为这不是新的算法;另外有人说起时间复杂度是n*lgn的,
21      * 其实不是,就算每次查找的时间是lgi,但是查找完毕还要移动元素,这个时间平均为i/2,
22      * 于是总时间为(1/2+lg1) + (2/2 + lg2) + (3/2 + lg3) + ... + ((n-1)/2 + lg(n-1)), 
23      * 约为n(n-2)/4+nlgn,所以时间复杂度还是n*n的。
24      * 
25      */
26     public static void dichotomySort(int[] source){
27         int i, j;
28         int left, right, mid;
29         int temp;
30         
31         for(i = 1; i<source.length; i++){
32             temp = source[i];
33             left = 0;
34             right = i - 1;
35             /*
36              * 二分法查找插入的位置
37              */
38             while(left <= right) {
39                 //指向已排序好的中间位置
40                 mid = (left+right) / 2;
41                 if(source[mid] > temp) {
42                     right = mid - 1; //即将插入的元素应当在在左区间
43                 }
44                 else 
45                     left  = mid + 1;//即将插入的元素应当在在右区间
46             }
47             /*
48              * 每次查找完毕后,left总比right大一,a[left]总是存放第一个比 temp 大的数,因此应从此处开始,
49              * 每个元素右移一位,并将 temp 存入a[left]中,这样就保证了a[0...i]是排好序的
50              */
51             for(j = i -1; j>right; j--) {
52                 source[j+1] = source[j];
53             }
54             source[right+1] = temp;
55         }
56     }
57 }

 

posted @ 2014-03-09 22:38  soul390  阅读(162)  评论(0编辑  收藏  举报