插入排序之表插入排序

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;
}
时间: 2024-08-30 14:28:04

插入排序之表插入排序的相关文章

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单.本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现. 一.直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表. 算法描述: 步骤1.将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录). 步骤2.依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中. 步

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

java排序之插入排序(直接插入排序和希尔排序)

上面一片博文探讨了关于的java选择排序(冒泡排序和快速排序)本章将继续探讨java排序之插入排序,插入排序分为直接插入排序和希尔排序两种. 1.直接插入排序思想:在需要排序的一组数据中假设前该数组的前n-1(n >= 2)个数是已经排好序的,现在要把第n个数插入到前面的n-1个数中,使得这n个数也是排好顺序的.如此反复进行,知道n等于需要排序的数组的长度时.就实现了该数组的直接插入排序. 代码如下: /** * * @param a 需要排序的数组 */ public static void

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

直接插入排序与二分插入排序的C++实现

1.直接插入排序 直接插入排序的过程可以理解为一个固定长度的数组被分为两个集合,即已排序集合和未排序. 开始时已排序集合为空,而未排序集合即为整个数组.当排序开始后插入一个对象,已排序集合元素数目加1,相应地未排序集合元素数目减1,重复插入过程直至将未排序集合清空为止,这时排序集合就是最终结果.如下图: C++实现如下,为了使得程序可以对各种基本数据类型都能排序,使用了模板类,注意模板类的类声明和成员函数实现必须在同一个cpp文件里面,不能分开!! 1 #ifndef INSERTSORT_H

直接插入排序与折半插入排序——Java实现

1.直接插入排序 1)原理说明:直接插入排序是一种最简单的插入排序方法,它的基本思想是,仅有一个元素的序列总是有序的,因此,对n 个记录的序列,可从第二个元素开始直到第n 个元素,逐个向有序序列中执行插入操作,从而得到n 个元素按关键字有序的序列. 2)代码实现如下: package com.test.sort; public class InsertSort { private static void sort(int[] data) { for (int i = 1; i < data.le

八大排序算法学习笔记:插入排序(二分插入排序)

二分插入排序   也称折半插入排序, 1.基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 2.代码:    3.复杂度: 用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较

LeetCode-Insertion Sort List-链表插入排序-链表操作

https://oj.leetcode.com/problems/insertion-sort-list/ 插入排序为假设[0,i)已经为有序数组,下一步从[i,n)找最小的元素交换到i处.用指针模拟这个过程即可.就是操作有些麻烦. 每次[head,p)为已经有序的数组,下次从[p,tail]找出最小的节点r以及其前继节点l.将其插入到lp->p之间.并且注意检测这个节点是否为p这样的边界条件. /** * Definition for singly-linked list. * struct

内部排序(3)——插入排序之折半插入排序

因为插入排序的基本思想是在一个有序序列中插入一个新的记录,则能够利用"折半查找"查询插入位置,由此得到的插入排序算法为"折半插入排序".算法例如以下: void BInsertSort () { // 对顺序表L作折半插入排序 for ( i=2; i<length; ++i ) { <span style="white-space:pre"> </span>r[0] = r[i]; // 将r[i]暂存到r[0]