排序算法(三)
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 }