经典算法回顾之插入排序

  插入排序的基本思想是:每次选择待排序的记录序列的第一个记录,按照排序值的大小将其插入到已排序的记录序列中的适当位置,直到所有记录全部排序完毕。

直接插入排序:

  直接插入排序是一种最简单的排序方法,整个排序过程为:先将第一个记录看做一个有序记录序列,然后从第二个记录开始,依次将为排序的记录插入这个有序的记录序列中,直到整个文件中的全部记录排序完毕。

  算法代码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 template<typename T>
 5 void DirectInsertSort(T unsorted[], int size)
 6 {
 7     for(int i=1; i < size; ++i)
 8     {
 9         if(unsorted[i] < unsorted[i-1])//大于,无需操作;小于,需后移
10         {
11             int j = i-1;
12             int temp = unsorted[i];//复制为哨兵,即存储为待排序元素
13             while(j >= 0 && temp < unsorted[j])//查找在有序表中的插入位置
14             {
15                 unsorted[j+1] = unsorted[j];//右移
16                 j--;
17             }
18             //找到位置,将temp插入
19             unsorted[j+1] = temp;
20         }
21     }
22 }
23 
24 int main(int argc, char *argv[])
25 {
26     int data[] = {12,4,1,6,3,9,10};
27     DirectInsertSort(data,7);
28     for(int i=0;i<7;i++)
29         cout << data[i] << " ";
30     return 0;
31 }

希尔排序:

  Shell排序的基本思想是:将整个序列分割为若干个子序列分别进行插入排序,然后改变分组,再进行插入;增量序列可为d={n/2, n/4, n/8, … , 1}。直接插入排序其实是d=1的希尔排序。

算法代码:

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4 
 5 template<typename T>
 6 void ShellInsert(T unsorted[], int size ,int dk)
 7 {//dk为增量;与直接插入排序对比记忆
 8     for(int i = dk; i < size; ++i)
 9     {
10         if(unsorted[i] < unsorted[i-dk])
11         {
12             int j = i - dk;
13             int temp = unsorted[i];
14             while(j >= 0 && temp < unsorted[j])
15             {
16                 unsorted[j+dk] = unsorted[j];
17                 j -= dk;
18             }
19             unsorted[j+dk] = temp;
20         }
21     }
22 }
23 
24 template<typename T>
25 void ShellSort(T unsorted[], int size)
26 {
27     int dk = size/2;
28     while(dk >=1)
29     {
30         ShellInsert(unsorted, size ,dk);
31         dk = dk/2;
32     }
33 }
34 int main(int argc, char *argv[])
35 {
36     int data[] = {12,4,1,6,3,9,10};
37     ShellSort(data,7);
38     for(int i=0;i<7;i++)
39         cout << data[i] << " ";
40     return 0;
41 }
原文地址:https://www.cnblogs.com/dreamrun/p/4366585.html