简单插入排序
概述
所谓插入排序 , 是指将无序序列中的各元素依次插入到已经有序的线性表中。在线性表中 , 只包含第 1 个元素的子表显然可以看成是有序表。
那么从线性表的第 2 个元素开始直到最后一个元素 , 逐次将其中的每一个元素插入到前面已经有序的子表中,即可完成排序。
操作流程
- 假设线性表中前 j -1 个元素已经有序 , 现在要将线性表中第 j 个元素插入到前面的有序子表中 , 插入过程如下
- 将第 j 个元素放到一个变量flag中
- 从有序子表的最后一个元素 ( 即线性表中第 j -1 个元素 ) 开始 , 往前逐个与 flag 进行比较 , 将大于 flag 的元素均依次向后移动一个位置
- 直到发现一个元素不大于 flag 为止 , 此时就将 flag ( 即原线性表中的第 j 个元素 ) 插入到刚移出的空位置上 , 有序子表的长度就变为 j 了
- 插入排序的示意图 . 图中画有方框的元素表示刚被插入到有序子表中
效率
在简单插入排序中,每一次比较最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同,在最坏的情况下,简单插入排序需要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 个元素开始直到最后一个元素 , 逐次将其中的每一个元素插入到前面已经有序的子表中,即可完成排序。
操作流程
- 假设线性表中前 j -1 个元素已经有序 , 现在要将线性表中第 j 个元素插入到前面的有序子表中 , 插入过程如下
- 将第 j 个元素放到一个变量
中 - 从有序子表的最后一个元素 ( 即线性表中第 j -1 个元素 ) 开始 , 往前逐个与 T 进行比较 , 将大于 T 的元素均依次向后移动一个位置
- 直到发现一个元素不大于 T 为止 , 此时就将 T ( 即原线性表中的第 j 个元素 ) 插入到刚移出的空位置上 , 有序子表的长度就变为 j 了
- 插入排序的示意图 . 图中画有方框的元素表示刚被插入到有序子表中
效率
在简单插入排序中,每一次比较最多移掉一个逆序,因此,这种排序方法的效率与冒泡排序法相同,在最坏的情况下,简单插入排序需要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 }
------------恢复内容结束------------

浙公网安备 33010602011771号