排序算法:插入排序,折中插入排序

1??插入排序:把序列分为有序和无序两部分排序,如果是升序,则无序和有序比较小则有序右移直到找到大于有序值然后替换,大于则不变,有序++;继续比较;

主要用途:直接插入算法实现简单,在序列基本有序的情况下,移动和比较的次数少,所以有序情况下优先插入排序

复杂度与稳定度:属于稳定的排序方法,时间复杂度 O(n^2) 空间复杂度 O(1);

C/C++:

 1 #include <iostream>
 2
 3 int *InsertSort(int *Array, int size)
 4 {
 5     if (Array == nullptr)
 6         return nullptr;
 7
 8     //思想分为有序和无序部分
 9     int unorder = 0, order = 0, temp;
10
11     for (unorder = 1; unorder < size; unorder++)
12     {
13         //保存比较的值
14         temp = *(Array + unorder);
15         for (order = unorder - 1; order >= 0 && temp < *(Array + order); order--)
16         {
17             //升序,无序值小于有序值则有序值右移,直到找到比有序小的或order==0;
18             *(Array + order + 1) = *(Array + order);
19         }
20         //不移动则赋值给自身,或者找到插入位置,赋值插入位置后的位置;
21         *(Array + order + 1) = temp;
22     }
23     return Array;
24 }
25
26
27 int main()
28 {
29
30     int a[] = {17, 46, 32, 87, 58, 9, 50, 38};
31     int size = sizeof(a) / sizeof(int);
32     InsertSort(a, size);
33
34     std::for_each(std::begin(a), std::end(a), [](int &value)
35     { std::cout << value << "\t"; });
36     std::cout << std::endl;
37     return 0;
38 }

2??折中插入排序:与插入排序的区别,寻找插入位置由从右到左遍历比较变为二分法查找比较(减少比较次数)

主要用途:同插入排序

复杂度与稳定度:同插入排序(虽然比较次数少了)

C/C++:

#include <iostream>

//折中插入排序,和插入排序的区别就是改变 无序在有序中查找位置的方式,前者是折中查找(减少比较次数),后者是从右到左遍历比较
int *HalfInsertSort(int *Array, int size)
{
    if (Array == nullptr)
        return nullptr;

    //思想分为有序和无序部分
    int unorder = 0, order = 0, temp;

    //计算机中两数之和除以2取整之后值靠左(个人理解),(low+hight)/2 最终位置保存在low位置;
    int low = 0, hight = 0, mid = 0;

    for (unorder = 1; unorder < size; unorder++)
    {
        //保存比较的值
        temp = *(Array + unorder);

        //寻找位置,终止条件位置出现负值之前- -,(升序)
        for (low = 0, hight = unorder - 1; hight >= low;)
        {
            mid = (low + hight) / 2;
            if (temp < *(Array + mid))
            {
                hight = mid - 1;
            } else
            {
                low = mid + 1;
            }
        }

        //找到插入点low,移动
        for (order = unorder - 1; order >= low; order--)
        {
            //升序,无序值小于有序值则有序值右移,直到找到比有序小的或order==0;
            *(Array + order + 1) = *(Array + order);
        }

        *(Array + low) = temp;
    }
    return Array;
}

int main()
{

    int a[] = {17, 2, 3, 5, 4, 4, 34, 43, 323, 434, 234, 21, 46, 32, 87, 58, 9, 50, 38};
    int size = sizeof(a) / sizeof(int);
    InsertSort(a, size);

    std::for_each(std::begin(a), std::end(a), [](int &value)
    { std::cout << value << "\t"; });
    std::cout << std::endl;
    return 0;
}
时间: 2024-11-29 01:23:05

排序算法:插入排序,折中插入排序的相关文章

排序算法之 Java插入排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class Insert { public int[] sort(int[] arr){ if ( arr == null || arr.length <= 1 ){ return

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

结构-行为-样式-Js排序算法之 直接插入排序

最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n>=2)个值已经排序好了,那我们就从第n+1个与前面进行比较,当  a[n+1] > a [i] && a[n+1] < a[i-1] 的时候则进行插入,以此类推. var arr = [23,85,61,37,55,12,63,12,99,39,70,21]; function

排序算法总结之插入排序

一,插入排序介绍 插入排序是基于比较的排序.所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置. 因此,对于这类排序,就有两种基本的操作:①比较操作: ②交换操作 其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置.(下面的插入排序就用到了这个技巧)--因为,交换操作需要三次赋值,而移动操作只需要一次赋值! 有些排序算法,比较次数比较多,

排序算法之直接插入排序

基本思想: 直接插入排序的思想非常简单,将序列中第一个元素作为一个有序序列,然后将剩下n-1个元素按关键字大小依次插入该有序序列,每插入一个元素后依然保持该序列有序,经过n-1趟排序后即成为有序序列. 直接插入排序示例: 由图可以看到,括号里面的都是有续表,而货号后面的灰色关键字是下一个将要插入的元素. 代码: void InsertSort(int A[],int n) { int i; for(i=1; i<n; i++)//总共n-1趟 { int j=i; int temp=A[i];/

排序算法系列:插入排序算法

概述 直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. – <大话数据结构> 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 本文作者:Coding-Naga 发表日期: 2016年3月24日 原文链接:http://blog.csdn.net/lemon_tree12138/article/details/50968422 来源:CSDN 更多内容:分类 &

排序算法之直接插入排序算法

基本思想 当插入第i(i≥1)个元素,前面的i-1个元素已经排好序.这时用第i个元素与前i-1个元素进行比较,找到插入位置即将第i个元素插入,原来位置上的元素向后顺移. 代码: //待排数据存储在数组a中,以及待排序列的左右边界 public void InsertSort(int[] a, int left, int right) { int temp;//临时变量 int i, j;//循环标记 for (i = left + 1; i <= right; i++) {//遍历待排序列 if

排序算法系列之插入排序 (1)

排序,即是以一定的规则组织数据,排序算法的优劣关键在于比较数据的交换和移动次数. 排序算法需要考虑的几点:数据交换次数,移动次数,数据越界,算法的实用性(符合多种类型) //预知:使用C#拓展方法进行数据输出,使用StringBuilder节约内存开销 public static class DebugExtension { public static void DebugArray<T>(T[] array) { StringBuilder sb = new StringBuilder(ar

常用排序算法之--直接插入排序

一直以来都是从博客园吸收营养,很想有机会写一些对博友们有用的文章,来回馈大家的无私奉献.最近博主在找工作,听小伙伴们说,数据结构与算法是必考项.于是痛下绝心决定写写排序算法.以备自查,同时与小伙伴们互勉.欢迎大家转载,如有错误,请指正.必感激不尽! 学习交流qq:792911374,闲话不说,开始正文了..... 直接插入排序将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止