c++内排序

本文档展示了如何使用C++模板类实现直接插入排序和折半插入排序算法,通过实例演示了如何对整型数组进行排序,并提供了完整的代码实现。这两种排序方法在内排序中具有不同效率,适合于小规模数据或部分有序的数据集。
摘要由CSDN通过智能技术生成

// 直接插入排序、 折半插入排序
#include <iostream>
using namespace std;

template <typename T>
struct RecType        //内排序顺序表的记录类型
{
    T key;        //存放关键字
    char data;        //存放其他数据,假设为char类型
};

template <typename T>
class MSortClass        //内排序类模板
{
    RecType<T> R[100];    //存放顺序表中元素
    int length;            //存放顺序表的长度
public:
    MSortClass();        //构造函数,用于顺序表的初始化
    void SetK(T a[], int n);
    void DispR();        //输出R的所有元素
    void InsertSort();        //对R[0..n-1]按递增有序进行直接插入排序
    void BinInsertSort();    //对R[0..n-1]按递增有序进行折半插入排序
};

template <typename T>
MSortClass<T>::MSortClass()
{
    length = 0;
}

template <typename T>
void MSortClass<T>::SetK(T a[], int n)
{
    int i = 0;
    for (int i = 0; i < n; i++)
    {
        R[i].key = a[i];
    }
    length = n;

}


template <typename T>
void MSortClass<T>::DispR()
{
    for (int i = 0; i < length; i++)
        cout << R[i].key << "";
    cout << endl;

}

template <typename T>
void MSortClass<T>::InsertSort() //对R[0..n-1]按递增有序进行直接插入排序
{
    int i, j;
    RecType<T> tmp;
    for (i = 1; i < length; i++)    //直接插入排序是从第2个元素即R[1]开始的
    {
        if (R[i].key < R[i - 1].key)
        {
            tmp = R[i];    //取出无序区的第一个元素
            j = i - 1;    //从右向左在有序区R[0..i-1]中找R[i]的插入位置
/*
            do
            {
                R[j + 1] = R[j];    //将关键字大于tmp.key的元素后移
                j--;        //继续向前比较
            } while (j >= 0 && R[j].key > tmp.key);
            R[j + 1] = tmp;    //在j+1处插入R[i]
*/

            while (j >= 0 && R[j].key > tmp.key)
            {
                R[j + 1] = R[j];
                j--;
            }
            R[j + 1] = tmp;

        }
    }
}

template <typename T>
void MSortClass<T>::BinInsertSort()  //对R[0..n-1]按递增有序折半插入排序
{
    int i,j,low,high,mid;
    RecType<T> tmp;
    for (i = 1; i < length; i++)
    {
        if (R[i].key < R[i - 1].key)
        {
            tmp = R[i];            //将R[i]保存到tmp中
            low = 0; high = i - 1;
            while (low <= high)    //在R[low..high]中折半查找有序插入的位置
            {
                mid = (low + high) / 2;        //取中间位置
                if (tmp.key < R[mid].key)
                    high = mid - 1;        //插入点在左半区
                else
                    low = mid + 1;        //插入点在右半区
            }
            for (j = i - 1; j >= high + 1; j--)    //元素后移
                R[j + 1] = R[j];
            R[high + 1] = tmp;        //插入原来的R[i]
        }
    }
}


int main()
{
    int array[] = { 2,5,7,3,8,1 }; int N = 6;
    MSortClass<int> a;
    a.SetK(array, N);
    a.InsertSort();
    a.DispR();

    a.BinInsertSort();
    a.DispR();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值