算法学习-二分法排序

来源:互联网 发布:修复手游闪退软件下载 编辑:程序博客网 时间:2024/05/18 12:43

       有时我常想,如果...那么...,可是人生没有那么多的假设。换句话说,今天我们所遇到的的瓶颈,正是见证我们成长的东西。就象修仙小说写的,当修炼到圆满时,就会遭遇雷劫。通过雷劫的考验才能升级,然后进行下一等级的修炼。人生痛苦和幸福的活着。为什么学习算法?因为算法能让我们透过性象认识本质。没有算法和数据结构的理论为指导,不管我们工作几年、看过多少的代码,获取多少的经验,也只是代码的搬运工,不能造轮子。就象只懂外力,不懂内在修炼的话,永远无法成为大师。不要在乎结果,跟着心,一步一步......


认识二分法排序


(1) 什么是二分法插入排序。

         二分法插入排序是在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。


(2) 二分法插入排序的复杂度。

       二分插入排序是稳定的与二分查找的复杂度相同;
      最好的情况是当插入的位置刚好是二分位置 所用时间为O(n);
      最坏的情况是当插入的位置不在二分位置 所需比较次数为
      log₂n
      S<=∑n「log₂n「-2^n「log₂n「+1
      k= 1
     平均时间O(n^2)

编程

public class BinayInsertSortSample {public void sort(int[] a) {int len = a.length;for (int i = 0; i < len; i++) {int left = 0;int right = i - 1;int mid = 0;int temp = a[i]; // 待插入到前面有序序列的值while(left <= right) {mid = (left + right) / 2;if (temp < a[mid]) {right = mid - 1;} else {left = mid + 1;}}for (int j = i - 1; j >= left; j--) {//比left右边大的值往后移一位,等待temp插入a[j + 1] = a[j];}if (left != i) {a[left] = temp;}}for (int i = 0; i < len; i++) {System.out.println(" " + a[i]);}}public static void main(String[] args) {BinayInsertSortSample binaryInsertSort = new BinayInsertSortSample();int [] a = {10,8,11,3,4,6,7,11,2,90,18,33,28,-1,0,7};binaryInsertSort.sort(a);}}


参考资料:

二分法排序百度百科

http://baike.baidu.com/link?url=9qAs-irtrsFCARtl9b8bnm9IqAfn6dU8_HEr3YjtefQcUlNZvwG-vSEUFaM5nXobcakpsAvCiWgq2xl_3Ylg0byGapktlKqJRYHPvcfQqWYA6vT-a2HCkUQs08S59UWNmHVjBWufmYWBgu0E7MktK_UbvAgzo8ZORJdBryAi_Xe

0 0
原创粉丝点击