插入排序、折半插入排序、希尔排序(缩小增量排序)
2017-11-16 11:15
417 查看
待排序的记录序列的3中存储方式
顺序表静态链表,对指针(存储的数组下标)进行排序
另设一个指示各个记录数据的地址位置的地址向量,对存储对地址进行排序
存储结构
typedef struct{ Keytype key; InfoType info; }RedType; typedef struct{ RedType r[MAXSIXE+1]; //r[0]位置作为哨兵单元 int length; }SqList;
插入排序
将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增 1 的有序表。void insertSort(SqList &L){ int i=0,j=0; for(int i=2;i<L.length;i++){ if(L.r[i].key<L.r[i-1].key){ L.r[0] = L.r[i]; L.r[i] = L.r[i-1]; for(j = i-2;L.r[0].key<L.r[j].key;j--){ L.r[j+1] = L.r[j]; } L.r[j+1] = L.r[0]; } } }
折半插入排序
在插入排序的基础上,改变比较的方式,使用二分查找法找到插入位置,再把所有大于(小于)关键字的记录后移,并插入到关键位置。希尔排序(缩小增量排序)
算法思想:先将整个待排序的记录序列分割成若干个子序列并分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。子序列的构成不是简单的“逐段分割”,而是将相隔某个“增量”的记录组成一个子序列。
逐次缩小增量,如5,3,1
void shellInsert(SqList &L,int increment){ int i=0,j=0; for(i=increment+1;i<L.length;i++){ if(L.r[i].key<L.r[i-increment].key){ L.r[0] = L.r[i]; L.r[i] = L.r[i-1]; for(j = i-increment;L.r[0].key<L.r[j].key;j-=increment){ L.r[j+increment] = L.r[j]; } L.r[j+increment] = L.r[0]; } } } void shellSort(SqList &L,int dlta[],int t){ for(int k=0;k<t;++k){ shellInsert(L,dlta[k]); } }
相关文章推荐
- 排序-插入排序-希尔排序(缩小增量排序)-数据结构(28)
- 一天一排序之“希尔排序(缩小增量排序)”
- 排序3:插入排序(普通插入排序 + 折半插入排序 + 链表插入排序 + 希尔排序)
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 排序算法的C++ && Python实现---希尔排序(缩小增量排序)
- 排序(插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排、归并排序、基数排序)
- java数据结构之插入排序(直接插入排序、折半插入排序、希尔排序)
- ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列
- 八大排序算法 之 希尔排序(缩小增量排序)
- 数据结构之插入排序之希尔排序(缩小增量排序)—参考整理严蔚敏数据结构
- 算法【4】:希尔排序(缩小增量排序)
- Java 希尔排序(缩小增量排序)
- 各种排序算法汇总(插入排序:直接插入排序、折半插入排序、希尔排序)
- 排序算法(八)希尔排序(缩小增量排序)
- 通俗理解插入排序(直接插入排序,折半插入排序,希尔排序)
- 希尔排序 缩小增量排序
- Java排序算法总结之(一)——插入排序(直接插入排序、折半插入排序、希尔排序)
- 希尔排序(缩小增量排序)
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 排序 - 希尔排序(缩小增量排序)