直接插入排序
对《大话数据结构》P386~P388—直接插入排序,进行了自己的理解并完善了代码。
代码和解释如下(VS2012测试通过):
1 #include <iostream>
2 using namespace std;
3 #define MAXSIZE 5//用于要排序数组个数最大值,可根据需要修改
4
5 //排序用的顺序表结构
6 typedef struct
7 {
8 int r[MAXSIZE+1];//定义一个数组,用于存储要排序的数,r[0]作为临时变量
9 int length;//用于记录顺序表的长度
10 }SqList;
11
12 //排序表的初始化
13 SqList *InitSqList(SqList *L)
14 {
15 L=new SqList;
16 L->length=5;//本例中长度是5
17 cout<<"input list"<<endl;
18 for(int i=1;i<=L->length;i++)
19 cin>>L->r[i];
20 return L;
21 }
22
23 //数组遍历输出
24 void PrintSqList(SqList *L)
25 {
26 for(int i=1;i<=L->length;i++)
27 cout<<L->r[i]<<" ";
28 cout<<endl;
29 }
30
31
32 //交换r[i]和r[j]
33 void swap(SqList *L,int i,int j)
34 {
35 int temp=L->r[i];
36 L->r[i]=L->r[j];
37 L->r[j]=temp;
38 }
39
40 //直接插入排序
41 void InsertSort(SqList *L)
42 {
43 for(int i=2;i<=L->length;i++)
44 {
45 if(L->r[i]<L->r[i-1])//如果r[i]比排在它前面的数小
46 {
47 int j;
48 L->r[0]=L->r[i];//把r[i]移动到哨兵位置
49 for(j=i-1;L->r[j]>L->r[0];j--)//从r[i-1]开始,与哨兵比较,如果比它大
50 L->r[j+1]=L->r[j];//把该元素依次右移一位,直至r[j]比哨兵小,结束循环
51 //因为有j--,结束循环后,r[j]是比r[0]小的
52 L->r[j+1]=L->r[0];//所以把哨兵插入到r[j+1]
53 cout<<"after one sort"<<endl;
54 PrintSqList(L);
55 }
56 }
57 }
58
59 int main()
60 {
61 SqList *p=NULL;
62 p=InitSqList(p);//初始化
63 InsertSort(p);//排序
64 cout<<"after sort"<<endl;
65 PrintSqList(p);//输出
66 }
运行结果:
时间复杂度分析见草稿。
1、如果已有序,时间复杂度O(n)
2、如果是逆序的,时间复杂度是O(n2)
-------------------------------------------------
原创博客 转载请注明出处http://www.cnblogs.com/hslzju
-------------------------------------------------