• 直接插入排序


    插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

    一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

    1. 从第一个元素开始,该元素可以认为已经被排序
    2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
    3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    5. 将新元素插入到该位置后
    6. 重复步骤2~5
        1 // 参考白话经典算法之直接插入排序的思想
        2 #include <stdio.h>
        3 
        4 void SwapValue(int *OperatorA, int *OperatorB)
        5 {
        6     if ((NULL == OperatorA) || (NULL == OperatorB))
        7     {
        8         printf ("Invalid Parameter(s)!\n");
        9         return;
       10     }
       11 
       12     if ((*OperatorA) != (*OperatorB))
       13     {
       14         *OperatorA ^= *OperatorB;
       15         *OperatorB ^= *OperatorA;
       16         *OperatorA ^= *OperatorB;
       17     }
       18 }
       19 
       20 void InsertSort(int *a, int N)
       21 {
       22     if ((NULL == a) || (N <= 0))
       23     {
       24         printf ("Invalid Parameter(s)!\n");
       25         return;
       26     }
       27 
       28     for (int i = 1; i < N; ++i)
       29     {
       30         int j;
       31 
       32         for (j = i-1; j >= 0; --j)
       33         {
       34             if (a[j] <= a[i])
       35             {
       36                 break;
       37             }
       38         }
       39 
       40         int nTemp = a[i];
       41 
       42         for (int k = i - 1; k > j; --k)
       43         {
       44             a[k+1] = a[k];
       45         }
       46 
       47         a[j+1] = nTemp;
       48     }
       49 }
       50 
       51 // 优化一,若在a[i]本就与a[0...i-1]有序则直接跳入下论循环
       52 void InsertSort1(int *a, int N)
       53 {
       54     if ((NULL == a) || (N <= 0))
       55     {
       56         printf ("Invalid Parameter(s)!\n");
       57         return;
       58     }
       59 
       60     for (int i = 1; i < N; ++i)
       61     {
       62         if (a[i] < a[i-1])
       63         {
       64             int j;
       65 
       66             for (j = i-1; j >= 0; --j)
       67             {
       68                 if (a[j] <= a[i])
       69                 {
       70                     break;
       71                 }
       72             }
       73 
       74             int nTemp = a[i];
       75 
       76             for (int k = i - 1; k > j; --k)
       77             {
       78                 a[k+1] = a[k];
       79             }
       80 
       81             a[j+1] = nTemp;
       82         }
       83     }
       84 }
       85 
       86 // 优化二,将搜索和移位和并在一起实现
       87 void InsertSort2(int *a, int N)
       88 {
       89     if ((NULL == a) || (N <= 0))
       90     {
       91         printf ("Invalid Parameter(s)!\n");
       92         return;
       93     }
       94 
       95     for (int i = 1; i < N; ++i)
       96     {
       97         if (a[i] < a[i-1])
       98         {
       99             int nTemp = a[i];
      100 
      101             for (int j = i - 1; (j >= 0) && (a[j] > nTemp); --j)
      102             {
      103                 SwapValue (&a[j+1], &a[j]);
      104             }
      105         }
      106     }
      107 }
      108 
      109 int main(void)
      110 {
      111     int a1[9] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
      112     int a2[9] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
      113     int a3[9] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
      114 
      115     InsertSort (a1, 9);
      116     InsertSort1 (a2, 9);
      117     InsertSort2 (a3, 9);
      118 
      119     for (int i = 0; i < 9; ++i)
      120     {
      121         printf ("%d ", a1[i]);
      122     }
      123 
      124     printf ("\n");
      125 
      126     for (int i = 0; i < 9; ++i)
      127     {
      128         printf ("%d ", a2[i]);
      129     }
      130 
      131     printf ("\n");
      132 
      133     for (int i = 0; i < 9; ++i)
      134     {
      135         printf ("%d ", a3[i]);
      136     }
      137 
      138     printf ("\n");
      139 
      140     return 0;
      141 }

  • 相关阅读:
    线性代数回顾+深化(未完成版)
    HIT OS2020 Spring Lab2
    选择
    工业互联网
    leetcode-200 岛屿数量
    记网易面试题<二>
    记网易面试题《一》
    leetecode-14-最长公共子串-简单
    leetcode-1012 至少有1位重复的数字
    协程
  • 原文地址:https://www.cnblogs.com/ldjhust/p/2986115.html
Copyright © 2020-2023  润新知