数据结构之插入排序(直插,折半插,2路插)—参考整理严蔚敏数据结构
来源:互联网 发布:java培训四个月课程表 编辑:程序博客网 时间:2024/06/01 09:34
#include<iostream>using namespace std;#define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)<(b))#define LQ(a,b) ((a)<=(b))#define MAXSIZE 20 // 一个用作示例的小顺序表的最大长度typedef int InfoType; // 定义其它数据项的类型typedef int KeyType; // 定义关键字类型为整型typedef struct RedType // 记录类型{KeyType key; // 关键字项InfoType otherinfo; // 其它数据项,具体类型在主程中定义}RedType;typedef struct SqList // 顺序表类型{RedType r[MAXSIZE + 1]; // r[0]闲置或用作哨兵单元int length; // 顺序表长度}SqList;void InsertSort(SqList &L){ // 对顺序表L作直接插入排序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作折半插入排序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; // 插入点在低半区elselow = m + 1; // 插入点在高半区}for (j = i - 1; j >= high + 1; --j)L.r[j + 1] = L.r[j]; // 记录后移L.r[high + 1] = L.r[0]; // 插入。or L.r[high+1]=L.r[0]}}void P2_InsertSort(SqList &L){ // 2_路插入排序int i, j, first, final;RedType *d;d = new RedType[L.length]; // 生成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.rL.r[i] = d[(i + first - 1) % L.length]; // 线性关系}void print(SqList L){int i;for (i = 1; i <= L.length; i++)printf("(%d,%d)", L.r[i].key, L.r[i].otherinfo);printf("\n");}#define N 8void main(){RedType d[N] = { { 49, 1 }, { 38, 2 }, { 65, 3 }, { 97, 4 }, { 76, 5 }, { 13, 6 }, { 27, 7 }, { 49, 8 } };SqList l1, l2, l3;int i;for (i = 0; i<N; i++) // 给l1.r赋值l1.r[i + 1] = d[i];l1.length = N;l2 = l3 = l1; // 复制顺序表l2、l3与l1相同printf("排序前:\n");print(l1);InsertSort(l1);printf("直接插入排序后:\n");print(l1);BInsertSort(l2);printf("折半插入排序后:\n");print(l2);P2_InsertSort(l3);printf("2_路插入排序后:\n");print(l3);}//顺序表插入排序
0 0
- 数据结构之插入排序(直插,折半插,2路插)—参考整理严蔚敏数据结构
- 插入类排序:直插,折半插,希尔
- 直插,折半,二路,希尔排序
- 哈希+直插排序
- 直插排序
- 直插排序
- 算法--直插排序
- 数据结构基础之折半查找与插值查找
- 白话算法之直插排序
- 数据结构之查找——折半查找、插值查找、斐波那契查找
- 数据结构与算法系列----直插,快排,堆排,归并排序讲解
- 数据结构之插入排序之希尔排序(缩小增量排序)—参考整理严蔚敏数据结构
- 数据结构-- 向量--插值查找
- 直插排序(C语言实现)
- 数据结构之 折半插入排序
- 数据结构之单链表头插法,尾插法
- 数据结构中静态顺序表的初始化、尾插、尾删、头插、头删、任意位置的插入及删除
- 16 - 12 - 17 十大排序算法总结(一) 之 冒泡,简选,直插,希尔排序
- Hadoop压缩与解压
- lvs、haproxy、nginx 负载均衡的比较分析
- 《R Cookbook》中文笔记
- 工作笔记之杂七杂八
- POJ1006(中国剩余定理+大衍求一术)
- 数据结构之插入排序(直插,折半插,2路插)—参考整理严蔚敏数据结构
- LeetCode: Partition List
- 第十一周 项目5 求一年中第几天
- 设计模式学习之备忘录模式(Memento,行为型模式)(19)
- 行人检测(Pedestrian Detection)小结-Part III(相关论文总结报告)
- Android学习之路
- 二叉搜索树建立、插入、删除、前继节点、后继节点之c++实现
- 杭电ACM1000题
- Android自动测试之Monkey工具