插入排序

【1】插入排序

(1)基本概念

插入排序的时间复杂度为O(n^2)。

插入排序是稳定的排序方法(参见随笔《常用排序算法稳定性分析》)。

插入排序算法适用于少量数据的排序。

在此,我们只研究直接插入排序和二分插入排序。

(2)排序逻辑

<1>直接插入排序

直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。

直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。

当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

<2>二分插入排序

二分插入排序主要是因为它采取的是折半搜索待插项的具体位置策略。

二分插入排序首先默认当前排序数列是有序的。然后,从第二项开始进行排序。

首先,折半法查找具体插入索引index;

再对数列进行必要的移动;

最后,将待插项赋给所求索引index;

【2】C++实现插入排序

直接插入排序,示例代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 #define MAXSIZE 12
 5 
 6 void ShowArray(int br[])
 7 {
 8     for(int i = 0; i < MAXSIZE; ++i)
 9     {
10         cout<<br[i]<<"  ";
11     }
12     cout<<endl;
13 }
14 
15 void InsertSort(int br[],int n)
16 {
17     for(int i = 1; i<n; ++i)
18     {
19         if(br[i] < br[i-1])
20         {
21             int temp = br[i];
22             int j = i-1;
23 
24             do
25             {
26                 br[j+1] = br[j];
27                 --j;
28             }while(j >= 0 && br[j] > temp);
29 
30             br[j+1] = temp;
31         }
32     }
33 }
34 
35 void main()
36 {
37     int ar[MAXSIZE] = {23,34,45,78,90,12,49,92,32,19,46,8};
38     ShowArray(ar);
39     InsertSort(ar,MAXSIZE);
40     ShowArray(ar);
41 }
42 
43 /*
44 23  34  45  78  90  12  49  92  32  19  46  8
45 8  12  19  23  32  34  45  46  49  78  90  92
46  */

二分插入排序,示例代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 #define MAXSIZE 12
 5 
 6 void ShowArray(int br[])
 7 {
 8     for(int i = 0; i < MAXSIZE; ++i)
 9     {
10         cout<<br[i]<<"  ";
11     }
12     cout<<endl;
13 }
14 
15 void BinaryInsertSort(int br[],int n)
16 {
17     int left, right, mid, temp;
18     for(int i = 1; i < n; ++i)
19     {
20         if(br[i] < br[i-1])
21         {
22             left = 0; 
23             right = i-1;
24             temp = br[i];
25             while(left <= right)
26             {
27                 mid = (right-left)/2 + left;
28                 if(br[mid] > temp)
29                     right = mid - 1;
30                 else
31                     left = mid + 1;
32             }
33             for(int j = i-1; j >= left; --j)
34             {
35                 br[j+1] = br[j];
36             }
37             br[left] = temp;
38         }
39     }
40 }
41 
42 void main()
43 {
44     int ar[MAXSIZE] = {23,34,45,78,90,12,49,92,32,19,46,8};
45     ShowArray(ar);
46     BinaryInsertSort(ar,MAXSIZE);
47     ShowArray(ar);
48 }
49 
50 /*
51 23  34  45  78  90  12  49  92  32  19  46  8
52 8  12  19  23  32  34  45  46  49  78  90  92
53  */

 

Good Good Study, Day Day Up.

顺序  选择  循环  坚持  总结

作者:kaizen
声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
签名:顺序 选择 循环
原文地址:https://www.cnblogs.com/Braveliu/p/2852641.html