简单插入排序

概述

   所谓插入排序 , 是指将无序序列中的各元素依次插入到已经有序的线性表中。在线性表中 , 只包含第 1 个元素的子表显然可以看成是有序表。

   那么从线性表的第 2 个元素开始直到最后一个元素 , 逐次将其中的每一个元素插入到前面已经有序的子表中,即可完成排序。

操作流程

  1. 假设线性表中前 j -1 个元素已经有序 , 现在要将线性表中第 j 个元素插入到前面的有序子表中 , 插入过程如下
  2. 将第 j 个元素放到一个变量flag中
  3. 从有序子表的最后一个元素 ( 即线性表中第 j -1 个元素 ) 开始 , 往前逐个与 flag 进行比较 , 将大于 flag 的元素均依次向后移动一个位置
  4. 直到发现一个元素不大于 flag 为止 , 此时就将 flag ( 即原线性表中的第 j 个元素 ) 插入到刚移出的空位置上 , 有序子表的长度就变为 j 了
  5. 插入排序的示意图 . 图中画有方框的元素表示刚被插入到有序子表中

效率

  在简单插入排序中,每一次比较最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同,在最坏的情况下,简单插入排序需要n(n-1)/2次比较

程序代码

 1 /**
 2   ******************************************************************************
 3   * @file           : insert_sort.c
 4   * @brief          : 简单插入排序函数及其使用范例
 5   ******************************************************************************
 6   * @attention
 7   *
 8   * 本程序参考了《计算机软件技术基础》3.3.2例程
 9   * 需要注意的是,本排序文件中的void main()与bubble_sort.c文件中的完全相同
10   * 排序算法本体为void insert_sort(T p[],int size)
11   * 使用测试及范例在void main()中
12   * 
13   ******************************************************************************
14   */
15 
16 #include<iostream>
17 #include<iomanip>
18 
19 using namespace std;
20 
21 /**
22   * @brief  简单插入排序函数
23   * @param  p: 指向待排序数据的指针
24   * @param  size: 待排序数据的个数
25   * @retval 分界线位置
26   */
27 template<class T>
28 void insert_sort(T *p,int size)
29 {
30     int j,k;
31     T flag;
32     for(j=1;j<size;j++)
33     {
34         flag=p[j];
35         k=j-1;
36         while ((k>=0)&&(p[k]>flag))
37         {
38             p[k+1]=p[k];
39             k=k-1;
40         }
41         return;
42     }
43 }
44 
45 void main()
46 {
47     int i,j,k;
48     double p[50];
49     for(i=0,j=0;i<50;i++,j++)   //载入待排序序列
50     {
51         p[i]=j;
52         if(j==9)j=-1;
53     }
54     cout<<"排序前的序列"<<endl;
55     for(i=0,k=0;i<10;i++)
56     {
57         for(j=0;j<5;j++)
58         {
59             cout<<p[k]<<"   ";
60             k=k+1;
61         }
62         cout<<endl;
63     }
64     cout<<endl;
65     insert_sort(p,50);
66     cout<<"排序后的序列"<<endl;
67     for(i=0,k=0;i<10;i++)
68     {
69         for(j=0;j<5;j++)
70         {
71             cout<<p[k]<<"   ";
72             k=k+1;
73         }
74         cout<<endl;
75     }
76     cout<<endl;
77 }

 

------------恢复内容开始------------

概述

   所谓插入排序 , 是指将无序序列中的各元素依次插入到已经有序的线性表中。在线性表中 , 只包含第 1 个元素的子表显然可以看成是有序表。

   那么从线性表的第 2 个元素开始直到最后一个元素 , 逐次将其中的每一个元素插入到前面已经有序的子表中,即可完成排序。

操作流程

  1. 假设线性表中前 j -1 个元素已经有序 , 现在要将线性表中第 j 个元素插入到前面的有序子表中 , 插入过程如下
  2. 将第 j 个元素放到一个变量
  3. 从有序子表的最后一个元素 ( 即线性表中第 j -1 个元素 ) 开始 , 往前逐个与 T 进行比较 , 将大于 T 的元素均依次向后移动一个位置
  4. 直到发现一个元素不大于 T 为止 , 此时就将 T ( 即原线性表中的第 j 个元素 ) 插入到刚移出的空位置上 , 有序子表的长度就变为 j 了
  5. 插入排序的示意图 . 图中画有方框的元素表示刚被插入到有序子表中

效率

  在简单插入排序中,每一次比较最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同,在最坏的情况下,简单插入排序需要n(n-1)/2次比较

程序代码

 1 /**
 2   ******************************************************************************
 3   * @file           : insert_sort.c
 4   * @brief          : 简单插入排序函数及其使用范例
 5   ******************************************************************************
 6   * @attention
 7   *
 8   * 本程序参考了《计算机软件技术基础》3.3.2例程
 9   * 需要注意的是,本快速排序文件中的void main()与bubble_sort.c文件中的完全相同
10   * 冒泡法排序算法本体为void insert_sort(T p[],int size)
11   * 使用测试及范例在void main()中
12   * 
13   ******************************************************************************
14   */
15 
16 #include<iostream>
17 #include<iomanip>
18 
19 using namespace std;
20 
21 /**
22   * @brief  简单插入排序函数
23   * @param  p: 指向待排序数据的指针
24   * @param  size: 待排序数据的个数
25   * @retval 分界线位置
26   */
27 template<class T>
28 void insert_sort(T *p,int size)
29 {
30     int j,k;
31     T flag;
32     for(j=1;j<size;j++)
33     {
34         flag=p[j];
35         k=j-1;
36         while ((k>=0)&&(p[k]>flag))
37         {
38             p[k+1]=p[k];
39             k=k-1;
40         }
41         return;
42     }
43 }
44 
45 void main()
46 {
47     int i,j,k;
48     double p[50];
49     for(i=0,j=0;i<50;i++,j++)   //载入待排序序列
50     {
51         p[i]=j;
52         if(j==9)j=-1;
53     }
54     cout<<"排序前的序列"<<endl;
55     for(i=0,k=0;i<10;i++)
56     {
57         for(j=0;j<5;j++)
58         {
59             cout<<p[k]<<"   ";
60             k=k+1;
61         }
62         cout<<endl;
63     }
64     cout<<endl;
65     insert_sort(p,50);
66     cout<<"排序后的序列"<<endl;
67     for(i=0,k=0;i<10;i++)
68     {
69         for(j=0;j<5;j++)
70         {
71             cout<<p[k]<<"   ";
72             k=k+1;
73         }
74         cout<<endl;
75     }
76     cout<<endl;
77 }

 

------------恢复内容结束------------

posted @ 2020-04-14 08:06  曲杨  阅读(365)  评论(0)    收藏  举报