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 }