[数据结构和算法]折半插入排序算法笔记

        /// <summary>
        /// 步骤:
        /// 1.记录当前待排元素
        /// 2.标记顺序表有序查找区域下界和上界
        /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置
        /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素
        /// 5.在空出的位置填写当前排序元素
        /// </summary>
        /// <param name="elements"></param>
        static void SqListSort(int[] elements)
        {
            int low; // 有序区域下界
            int mid; // 有序区域中界
            int high;// 有序区域上界
 
            int standBy;//待排序元素
 
            // 从顺序表的第二个元素开始,直到结束,逐个做折半插入排序
 
 
            for (int i = 1; i < elements.Length; i++)
            {
                standBy = elements[i]; // 记录待排序元素
                low = 0;               // 标记下界
                high = i - 1;          // 标记上界
 
                // 在有序区域内折半查找待排元素合适位置
                while (low <= high)
                {
                    mid = (low + high) / 2;         // 记录中界
                    if (standBy < elements[mid])    // 待排元素小于中界元素,说明在它适合的位置在前半区
                        high = mid - 1;             // 上界缩小
                    else
                        low = mid + 1;              // 大于则说明在后半区,下界往前
                }
 
                // 把elem[high+1 .. i-1]的元素都往后移动一位,腾出位子
                for (int j = i - 1; j > high + 1; j--)
                {
                    elements[j + 1] = elements[j];
                }
 
                // 待排元素待插入位置为high+1
                elements[high + 1] = standBy;
                
            }
        }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

[数据结构和算法]折半插入排序算法笔记,布布扣,bubuko.com

时间: 2024-12-14 12:16:31

[数据结构和算法]折半插入排序算法笔记的相关文章

数据结构——排序——直接插入排序和折半插入排序算法

直接插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0…n-1]: 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间. 3. i++并重复第二步直到i==n-1.排序完成. #include<stdio.h> #include<stdbool.h> vo

排序系列 之 折半插入排序算法 —— Java实现

基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程. 与直接插入算法的区别在于:在有序表中寻找待排序数据的正确位置时,使用了折半查找/二分查找. 实例: (参考直接插入排序算法:http://www.cnblogs.com/snowcan/p/6244128.htm

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

折半插入排序算法的C++实现

折半插入排序思想和直接插入排序类似. 1)找到插入位置: 2)依次后移正确位置及后面的元素. 区别是查找插入位置的方法不同. 折半插入排序使用的折半查找法在一个已经有序的序列中找到查找位置. 注意,折半查找法的一个基本条件就是序列已经有序. 直接上代码: #include<iostream> using namespace std; void binaryInsertionSort(int arr[],int n){ int mid; for(int i=1;i<n;i++){ int

经典算法复习-插入排序算法

温习<数据结构C语言版>,看到排序算法,感觉看不懂. 写到代码实现下,花费了很久才搞出来. 实现的跟书本上的有点不一样哦,不喜勿喷. 参考文章: http://blog.csdn.net/hguisu/article/details/7776068 #include <stdio.h> #include <stdlib.h> int main() { printf("---------insert sort algorithm------------\n\n&

java 算法之插入排序算法

这算是经典算法了,网上很多朋友都写了,有的我看不懂,所以我自己按照我自己所理解的写出来, 我觉得只有自己写出来的东西才是自己的 主要思路: 1.将数组的前两个数进行大小排序 2.将第三个数与前两个数进行比较,将第三个数插入到合适的位置 3.循环 其实这样来将对于新手来说,将其变成代码是有点困难的. 我也是.我很笨,没办法,只有将详细的一步一步写出来 // 数组 [3,5,1,2,8,9] 如有这样一个数组,按照上面的思路,我们从第二个数开始,就是5,5要跟3比较,第二个位置就是5要插入的位置 [

算法之-归并排序算法,插入排序算法

一.归并排序法 归并排序是效率还是比較高的算法.当中的分治法是经常使用的一种解决这个问题的方法,如今流行的云计算事实上就是一种分治法的应用. 所谓的分治法,字面解释就是"分而治之",就是把一个复杂的问题分成两个或很多其它的同样或相似的子问题,直到最后子问题能够简单的直接求解.原问题的解即子问题的解的合并.这个思想在实际工作中的作用很大,特别是处理大数据和做复杂运算的时候. 归并排序的基础是归并操作merge,即将两个有序数组合并为一个有序数组. 归并排序的算法思路为: 第一次扫描数组,

【数据结果与算法】插入排序算法

java语言实现 void insertionSort(int[] A) { for(int i=1;i<A.length;i++) { int value=a[i]; int j=i-1; while(a[j]>value&&j>=0) { a[j+1]=a[j]; j--; } a[j]=value; } }

排序算法 之 插入排序

本次介绍排序算法中的插入排序. 1.直接插入排序: 基本思想: 直接插入排序也需要对待排序的序列在外层进行n-1次遍历,每次遍历时只把本次遍历次数处的元素和该元素之前的元素进行比较,来决定插入位置,并把从插入位置开始到该元素之前的所有元素后移,使从序列开始到该元素为止序列中的元素有序,直至遍历完成序列整体有序,插入排序算法的时间复杂度为O(n2): 如下表格所示为待排序的序列: 3 2 1 7 6 5 4 8 9 当进行第一次遍历时把元素e[1]和e[0]作比较,e[1]<e[0],所以e[1]