排序—二分法插入排序

思路和插入排序一样,可见:http://www.cnblogs.com/PerkinsZhu/p/5664808.html

不同点: 在寻找插入位置的时候采用二分法定位。二分法怎么定位?……

运行结果:

原数组:              21、8、2、18、0、9、27、12、5、24、

第0次循环排序结果: 8、21、2、18、0、9、27、12、5、24、
第1次循环排序结果: 2、8、21、18、0、9、27、12、5、24、
第2次循环排序结果: 2、8、18、21、0、9、27、12、5、24、
第3次循环排序结果: 0、2、8、18、21、9、27、12、5、24、
第4次循环排序结果: 0、2、8、9、18、21、27、12、5、24、
第5次循环排序结果: 0、2、8、9、18、21、27、12、5、24、
第6次循环排序结果: 0、2、8、9、12、18、21、27、5、24、
第7次循环排序结果: 0、2、5、8、9、12、18、21、27、24、
第8次循环排序结果: 0、2、5、8、9、12、18、21、24、27、

直接看代码吧:

public void binaryInsertionSort(int[] array) {
        printArray("原数组:", array);
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int right = i - 1;
            int left = 0;
            int mid;
            // 定位
            while (left <= right) {
                mid = (left + right) / 2;
                if (array[mid] > temp) {
                    right = mid - 1;
                } else if (array[mid] < temp) {
                    left = mid + 1;
                }
            }
            // 移动数组
            for (int j = i; j > left; j--) {
                array[j] = array[j - 1];
            }
            // 在找到的位置插入
            array[left] = temp;
            printArray("第" + time++ + "次循环排序结果: ", array);
        }
    }
时间: 2024-12-20 00:51:43

排序—二分法插入排序的相关文章

二分法插入排序

二分法插入排序 算法思想简单描写叙述:在插入第i个元素时,对前面的0-i-1元素进行折半,先跟他们中间的那个元素比,假设小,则对前半再进行折半,否则对后半进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间的全部元素后移,再把第i个元素放在目标位置上.二分法没有排序,仅仅有查找.所以当找到要插入的位置时.移动必须从最后一个记录開始,向后移动一位,再移动倒数第2位,直到要插入的位置的记录移后一位.二分插入排序是稳定的,平均时间O(n2)     void binsort(re

算法导论—排序之插入排序

void insertion_sort(vector<int> &num){ for(int i = 1; i < num.size(); i++){ int j = i-1; int val = num[i]; while(j>=0 && num[j] >= val){ num[j+1] = num[j]; j--; } num[j+1] = val; } } 每次迭代时,将num[i] 作为key值,且前子数组[0,i-1] 构成已排好序,每次与左

选择排序、插入排序、冒泡排序python实现

选择排序的时间复杂度为O(n^2),是不稳定的排序 冒泡排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),平均情况下为O(n^2),是稳定的排序 插入排序的时间复杂度最好情况下为O(n),最坏情况下为O(n^2),,平均情况下为O(n^2),是稳定的排序 1.选择排序 def selection(lista): leng=len(lista); for i in range(0,leng): index=i; min=lista[i]; for j in range(i,leng)

Java选择排序,插入排序,快速排序

public class Test { public static void main(String[] args) { int a[] = { 1, 2, 3, 4, 5 }; // 选择排序(a); // 插入排序(a); quicksort(a, 0, a.length - 1); System.out.print("排序后:"); for (int n : a) { System.out.print(n + " "); } } static void 选择排

JavaScript算法(冒泡排序、选择排序与插入排序)

冒泡排序.选择排序与插入排序复杂度都是指数级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看<计算机科学概论(第三版)>里介绍的选择排序,插入排序看<计算机科学概论(第11版)>里介绍的插入排序, 通过这三份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 嗯,这本书里都有现成代码,就不在这儿写了,关键是弄清楚原理,然后

java排序之插入排序(直接插入排序和希尔排序)

上面一片博文探讨了关于的java选择排序(冒泡排序和快速排序)本章将继续探讨java排序之插入排序,插入排序分为直接插入排序和希尔排序两种. 1.直接插入排序思想:在需要排序的一组数据中假设前该数组的前n-1(n >= 2)个数是已经排好序的,现在要把第n个数插入到前面的n-1个数中,使得这n个数也是排好顺序的.如此反复进行,知道n等于需要排序的数组的长度时.就实现了该数组的直接插入排序. 代码如下: /** * * @param a 需要排序的数组 */ public static void

希尔排序(插入排序)-八大排序三大查找汇总(5)

基本思想 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 稳定性 由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的. 时间复杂度 希尔排序的时间复杂度取决于步长的选择. 平均情况下,

hdu1872 稳定的排序 (插入排序)

Problem Description http://acm.hdu.edu.cn/showproblem.php?pid=1872 大家都知道,快速排序是不稳定的排序方法. 如果对于数组中出现的任意a[i],a[j](i<j),其中a[i]==a[j],在进行排序以后a[i]一定出现在a[j]之前,则认为该排序是稳定的. 某高校招生办得到一份成绩列表,上面记录了考生名字和考生成绩.并且对其使用了某排序算法按成绩进行递减排序.现在请你判断一下该排序算法是否正确,如果正确的话,则判断该排序算法是否

python排序之一插入排序

python排序之一插入排序 首先什么是插入排序,个人理解就是拿队列中的一个元素与其之前的元素一一做比较交根据大小换位置的过程好了我们先来看看代码 首先就是一个无序的列表先打印它好让排序后有对比效果,然后我后面注释工作流程,下面我来一一说明下其运行流程,开始先声明一个插入排序的函数名insert_sort,要传入的参数为lis,count来获取列表lis长度len(lis),然后我们要开始写循环对比for i in range(从1到列表长度count)然后把列表下标为一位置的数也就是28(li