插入排序之表插入排序

简介:

1.表插入排序只是求得一个有序的链表,它是修改指针的值来代替移动记录,操作过程如下

2.但是这样只能进行顺序查找,不能进行随机查找,为了能实现有序表的折半查找,需要对记录进行重新排列。操作过程如下:

3.测试程序如下:


#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio> 
using namespace std;
typedef struct xxx{
    int head;//头结点 
    int a[100];
    int next[100];//记录下一个元素的位置 
    int len;
    xxx(){
        head = 1;
        memset(next, 0, sizeof(next));
    }
    void outList(){
        for(int i=1; i<=len; ++i){
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }
}Listx; 

Listx Lx;

void table_insertion_sort(){//表插入排序,相当于静态链表 
    for(int i=2; i<=Lx.len; ++i){
        int pre, p;
        for(p=Lx.head; p && Lx.a[p]<Lx.a[i]; pre=p, p=Lx.next[p]);
        if(p==0){
            Lx.next[pre] = i;
        } else if(p==Lx.head){
            Lx.next[i] = Lx.head;
            Lx.head = i;
        } else {
            Lx.next[pre] = i;
            Lx.next[i] = p;
        } 
    }
    //输出
    for(int i=Lx.head; i; i = Lx.next[i]) 
        cout<<Lx.a[i]<<" ";
    cout<<endl;
}

void arrang_table() {
    int p = Lx.head, q;
    for(int i=1; i<Lx.len; ++i){
        while(p < i) p = Lx.next[p];//第i个记录在表中的位置不应该小于 i,如果小于i,说明该元素已经被交换位置了,可以通过next继续寻找 
        q = Lx.next[p];//指向下一个节点 
        if(p!=i){//第p个元素应该在第i个位置 
            swap(Lx.a[i], Lx.a[p]);
            swap(Lx.next[i], Lx.next[p]);
            Lx.next[i] = p;//该元素之前的位置 p,指向被移走的记录,使得以后可由while循环找回 
        }
        p = q;
    }
    
    for(int i=1; i<=Lx.len; ++i) 
        cout<<Lx.a[i]<<" ";
    cout<<endl;
}

int main()
{
    int i;
    scanf("%d", &Lx.len);
    for(i=1; i<=Lx.len; i++)
        scanf("%d", &Lx.a[i]);
    table_insertion_sort();
    arrang_table();
    return 0;
}

目录
相关文章
|
4月前
|
缓存 Linux 云计算
OOM 杀进程 or 应用卡顿?该如何抉择
阿里云操作系统控制台推出了 FastOOM 功能,支持节点以及 Pod 级别的用户态 OOM 配置,通过提前介入杀进程的方式避 Near-OOM 导致的抖动夯机。
251 0
|
机器学习/深度学习 编解码 自动驾驶
速度快4倍 | MIT&交大&清华联合提出FlatFormer,一个非常高效的Transformer方法
速度快4倍 | MIT&交大&清华联合提出FlatFormer,一个非常高效的Transformer方法
436 0
|
Web App开发 Dart JavaScript
剖析require、import、export、exports、module.exports以及export default 的基本用法
剖析require、import、export、exports、module.exports以及export default 的基本用法
161 0
|
前端开发
React Hooks 常用技巧
摘要:React Hooks 是 React 16.8 中引入的新特性,可以让我们在不编写 class 组件的情况下,使用 state 和其他 React 特性。本文将介绍 React Hooks 的常用技巧,包括 useState、useEffect、useCallback、useRef 等。希望通过本文,能够帮助你更好地掌握 React Hooks 的使用方法。
156 0
|
关系型数据库 数据库 PostgreSQL
PostgreSql安装(win 2003 下)
操作系统为:2003 server,起先装了卡巴2010,同时下载了postgresql-8.4.1-1-windows.exe安装过程中,总是安装到最后,就死机。(postgresql很小,才几十M,8.4才38M,安装速度很快。
909 0
|
5天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
305 116