插入排序的基本思想是:每次选择待排序的记录序列的第一个记录,按照排序值的大小将其插入到已排序的记录序列中的适当位置,直到所有记录全部排序完毕。
直接插入排序:
直接插入排序是一种最简单的排序方法,整个排序过程为:先将第一个记录看做一个有序记录序列,然后从第二个记录开始,依次将为排序的记录插入这个有序的记录序列中,直到整个文件中的全部记录排序完毕。
算法代码:
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 }