• 【数据结构排序】之一插入排序


     

    1、排序的基本概念

    所谓排序就是整理表中的元素,把给定的一组数据,使之按照关键字(一般为索引值)递增或递减的顺序进行排列。

    2、排序的稳定性

    在待排序的表格中,存在多个关键字相同的元素 ,经过排序后这些具有相同关键字的元素之间的相对次序保持不变,则这种排序方式是稳定的;反之不稳定。

    3、插入排序

    插入排序就是每次将一个待排序的元素,按其关键字的大小插入到已经排好序的子表中的适当位置,直到全部元素插入完整为止。

    插入排序分为直接插入排序和希尔排序

    4、直接插入排序

     直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

    4.1 核心算法代码 :

    核心的代码:

     1 /*
     2 * 直接插入排序的核心程序
     3  */
     4      void insertSort(int array[],arraylength) 
     5          {
     6           int length =arraylength; 
     7                // 此循环从1开始,就是将0下标的元素当做一个参照 
     8                for (int i = 1; i < length; i++)
     9              { 
    10                if (array[i] < array[i - 1])// 将当前下标的值与参照元素比较,如果小于就进入里面 
    11   
    12               { 
    13        
    14                 int vacancy = i; // 用于记录比较过程中那个空缺出来的位置
    15 
    16                 int sentry = array[i]; // 设置哨兵,将当前下标对应的值赋给哨兵
    17                // 这个循环很关键,从当前下标之前一个元素开始倒序遍历,比较结果如果比当前大的,就后移
    18                 for (int j = i - 1; j >= 0 && array[j] > sentry; j--) 
    19                 { 
    20                    vacancy = j; 
    21                    array[j + 1] = array[j]; // 后移比当前元素大的元素 
    22                 } 
    23                 array[vacancy] = sentry; // 将哨兵,也就是当前下标对应的值置入空缺出来的位置
    24               } 
    25             } 
    26          }
    @外部循环的开始条件是int i = 1,里面有个if(array[i] > array[i - 1]),也就是如果当前记录比前面的记录小的时候才出列,出列后用sentry = array[i],记录下这个出列的记录,并用vacancy = i,记录下空缺位置。
    
    
    for (int i = 1; i < length; i++) {
                if (array[i] < array[i - 1]) { // 将当前下标的值与参照元素比较,如果小于就进入里面
                    int vacancy = i; // 用于记录比较过程中那个空缺出来的位置
                    int sentry = array[i]; // 设置哨兵,将当前下标对应的值赋给哨兵
    
    
    
    
    
    @如果出列了,注意内部循环的条件,是从当前记录的前一个开始的,然后倒序遍历,条件是如果遍历过程中有大于sentry的记录,就后移记录array[j + 1]  = array[j],然后将空缺位置变为j。
     
    
    for (int j = i - 1; j >= 0 && array[j] > sentry; j--) {
                        vacancy = j;
                        array[j + 1] = array[j]; // 后移比当前元素大的元素
                    }
    @比较完毕之后,array[vacancy] = sentry,是将出列的位置放到空缺位置。
    array[vacancy] = sentry; // 将哨兵,也就是当前下标对应的值置入空缺出来的位置

    4.2参考博文链接:

    http://blog.csdn.net/ysjian_pingcx/article/details/8674454

    http://blog.csdn.net/u014082714/article/details/43194827

                                                                           

    我有个朋友是爵士音乐家,他有次跟我说:如果你不是乐队里最差的演奏者,马上换支乐队。我现在在Spotify工作,在这里我每天都觉得自己是个【狗屁程序员】,也因此我离开了上一家公司,从Spotify重头开始。当我在这里再也感觉不到自己是个【狗屁程序员】的时候,我会选择离开,然后找一个能让我再次感到自己是坨屎的地方。这种策略在我的职业生涯里确实 帮了我大忙。 ------译自 Quora
  • 相关阅读:
    Newtonsoft.Json(Json.Net)学习笔记
    SQL Server 自动化运维系列
    WCF 动态调用(动态创建实例接口)
    SQL Server 自动化运维系列
    SQL Server 表水平分区
    WCF服务全局异常处理机制
    WCF 透明代理
    WCF扩展记录服务调用时间
    WCF身份验证三:自定义身份验证之<MessageHeader>
    用单链表实现算法2.1
  • 原文地址:https://www.cnblogs.com/wycBlog/p/7132211.html
Copyright © 2020-2023  润新知