插入排序

//插入排序头文件 Sort.h

#pragma once

#define T int
#define MAXSIZE 20
typedef T Sqlist[MAXSIZE];

void Swap(T *a, T *b)
{
    T tmp = *a;
    *a = *b;
    *b = tmp;
}
//直接插入排序
void InsertSort(Sqlist &list, int n)
{
    for (int i = 1; i < n; ++i)
    {
        if (list[i] < list[i - 1])
        {
            Swap(&list[i], &list[i - 1]);
            for (int j = i - 1; j>0 && list[j] < list[j - 1]; --j)
            {
                Swap(&list[j], &list[j - 1]);
            }
        }
    }
}

//折半插入排序  减少比较次数
void HalfInsert(Sqlist &list, int n)
{
    for (int i = 2; i < n; ++i)
    {
        list[0] = list[i];
        int low = 1;
        int high = i - 1;
        while (low <= high)
        {
            int mid = (low + high) / 2;
            if (list[0] >= list[mid])
            {
                low = mid + 1;
            }
            else
            {
                high = mid - 1;
            }
        }
        for (int j = i; j >high + 1; --j)
        {
            list[j] = list[j - 1];
        }
        list[high + 1] = list[0];
    }
}


//2路插入排序   减少数据移动次数
void TwoInsertSort(Sqlist &list,int n)
{
    Sqlist tmp;
    int head, tail;
    head = tail = 0;
    tmp[head] = list[0];
    for (int i = 1; i < n; ++i)
    {
        if (list[i] < tmp[head])
        {
            head = (head - i + n) % n;
            tmp[head] = list[i];
        }
        else if (list[i] > tmp[tail])
        {
            tail++;
            tmp[tail] = list[i];
        }
        else
        {
            int j;
            tail++;
            tmp[tail] = tmp[tail - 1];
            for (j = tail - 1; list[i] < tmp[(j - 1+n)%n]; j=(j-1+n)%n)
            {
                tmp[j] = tmp[(j - 1+n)%n];
            }
            tmp[j] = list[i];
        }
    }
    for (int i = 0; i < n; ++i)
    {
        list[i] = tmp[head];
        head = (head +1) % n;
    }
}

//表插入排序
#define MAXVALUE 0x7fffffff
typedef struct SLNode
{
    T data;
    int link;
}SLNode;
typedef SLNode Table[MAXSIZE];

void TableInsertSort(Table &t, int n)
{
    t[0].link = 1;
    int p, q;
    for (int i = 2; i < n; ++i)
    {
        p = t[0].link;
        q = 0;
        while ((p != 0) && (t[p].data<=t[i].data))
        {
            q = p;
            p = t[p].link;
        }
        t[i].link = t[q].link;
        t[q].link = i;
    }
}

//希尔排序
void ShellInsert(Sqlist &list, int n, int dk)
{
    int i, j;
    for (i = dk + 1; i < n; ++i)
    {
        if (list[i] < list[i - dk])
        {
            list[0] = list[i];
            for (j = i - dk; j>0 && list[0] < list[j]; j-=dk)
            {
                list[j + dk] = list[j];
            }
            list[j + dk] = list[0];
        }
    }
}
void ShellSort(Sqlist &list, int n, int dlta[], int t)
{
    for (int k = 0; k < t; ++k)
    {
        ShellInsert(list, n, dlta[k]);
    }
}

//测试函数

#include<iostream>
#include"Sort.h"
using namespace std;
#define USE_ZERO_SPACE

#if 1
void main()
{
#ifdef USE_ZERO_SPACE
    Sqlist L = {0, 49,38, 97, 76,13,49};
    int n = 7;
#else
    Sqlist L = {49,38, 65, 97, 76,13,27,49};
    int n = 8;
#endif
    //InsertSort(L, n);
    //HalfInsert(L, n);
    //TwoInsertSort(L, n);
    //int dlta[] = {3,2,1};
    //int t = sizeof(dlta) / sizeof(int);
    //ShellSort(L, n, dlta, t);
#ifdef USE_ZERO_SPACE
    for (int i = 1; i != n; ++i)
    {
        cout << L[i] << " ";
    }
    cout << endl;
#else
    for (int i = 0; i != n; ++i)
    {
        cout << L[i] << " ";
    }
    cout << endl;
#endif
}

#endif


//测试表排序
#if 0
void main()
{
    Sqlist L = { 0, -1, 45, 30, 32, 68 };
    int n = 6;
    Table tb;
    tb[0].data = MAXVALUE;
    tb[0].link = 0;
    for (int i = 1; i < n; ++i)
    {
        tb[i].data = L[i];
        tb[i].link = 0;
    }
    TableInsertSort(tb, n);

    for (int i = 0; i <n; ++i)
    {
        cout << tb[i].data << " ";
    }
    cout << endl;
    for (int i = 0; i < n; ++i)
    {
        cout << tb[i].link << "   ";
    }
    cout << endl;
}
#endif
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值