⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bo10-1.cpp

📁 清华大学《数据结构》教材第二版对应的C++教学程序
💻 CPP
字号:
 // bo10-1.cpp 顺序表插入排序的函数(3个)
 void InsertSort(SqList &L)
 { // 对顺序表L作直接插入排序。算法10.1
   int i,j;
   for(i=2;i<=L.length;++i)
     if LT(L.r[i].key,L.r[i-1].key) // "<",需将L.r[i]插入有序子表
     {
       L.r[0]=L.r[i]; // 复制为哨兵
       for(j=i-1;LT(L.r[0].key,L.r[j].key);--j)
         L.r[j+1]=L.r[j]; // 记录后移
       L.r[j+1]=L.r[0]; // 插入到正确位置
     }
 }

 void BInsertSort(SqList &L)
 { // 对顺序表L作折半插入排序。算法10.2
   int i,j,m,low,high;
   for(i=2;i<=L.length;++i)
   {
     L.r[0]=L.r[i]; // 将L.r[i]暂存到L.r[0]
     low=1;
     high=i-1;
     while(low<=high)
     { // 在r[low..high]中折半查找有序插入的位置
       m=(low+high)/2; // 折半
       if LT(L.r[0].key,L.r[m].key)
         high=m-1; // 插入点在低半区
       else
         low=m+1; // 插入点在高半区
     }
     for(j=i-1;j>=high+1;--j)
       L.r[j+1]=L.r[j]; // 记录后移
     L.r[high+1]=L.r[0]; // 插入
   }
 }

 void P2_InsertSort(SqList &L)
 { // 2_路插入排序
   int i,j,first,final;
   RedType *d;
   d=(RedType*)malloc(L.length*sizeof(RedType)); // 生成L.length个记录的临时空间
   d[0]=L.r[1]; // 设L的第1个记录为d中排好序的记录(在位置[0])
   first=final=0; // first、final分别指示d中排好序的记录的第1个和最后1个记录的位置
   for(i=2;i<=L.length;++i)
   { // 依次将L的第2个~最后1个记录插入d中
     if(L.r[i].key<d[first].key)
     { // 待插记录小于d中最小值,插到d[first]之前(不需移动d数组的元素)
       first=(first-1+L.length)%L.length; // 设d为循环向量
       d[first]=L.r[i];
     }
     else if(L.r[i].key>d[final].key)
     { // 待插记录大于d中最大值,插到d[final]之后(不需移动d数组的元素)
       final=final+1;
       d[final]=L.r[i];
     }
     else
     { // 待插记录大于d中最小值,小于d中最大值,插到d的中间(需要移动d数组的元素)
       j=final++; // 移动d的尾部元素以便按序插入记录
       while(L.r[i].key<d[j].key)
       {
         d[(j+1)%L.length]=d[j];
         j=(j-1+L.length)%L.length;
       }
       d[j+1]=L.r[i];
     }
   }
   for(i=1;i<=L.length;i++) // 把d赋给L.r
     L.r[i]=d[(i+first-1)%L.length]; // 线性关系
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -