C++ Exercises(十五)--排序算法的简单实现

简介:
struct Node 
{//队列结点
    int data;
    struct Node* pNext;
};
class CQueue
{//队列类(带头结点)
public:
    CQueue(void);
    ~CQueue(void);
    bool isEmpty()const;//是否为空
    void EnQueue(int num);//入队列
    int DeQueue();//出队列
    int Front()const;//对头元素
    void clearQueue();//清空队列
    int Size()const;
    void printQueue()const;
private:
    Node *front;//头结点
    Node *end;//尾结点
    int size;//队列大小
        
};
#include "Queue.h"
#include <cstdlib>
#include <assert.h>
#include <iostream>
using namespace std;

CQueue::CQueue(void)
{
    this->front = new Node;
    this->front->pNext = NULL;
    this->end = this->front;
    this->size = 0;
}
void CQueue::EnQueue(int num)
{//入队列
    Node* pNum = new Node;
    pNum->data = num;
    pNum->pNext = NULL;
    this->end->pNext = pNum;
    this->end = pNum;
    this->size++;
}
int CQueue::DeQueue()
{//出队列,返回对头元素值
    assert(this->front!=this->end);//队列不空
    int result;
    Node* pNum = this->front->pNext;
    result = pNum->data;
    if (pNum==this->end)
    {//队列中只有一个元素了
        this->front->pNext = NULL;
        this->end = this->front;
    }
    else
    {
        this->front->pNext = pNum->pNext;
    }
    delete pNum;
    this->size--;
    return result;
}
void CQueue::clearQueue()
{//清空队列
    if (!this->isEmpty())
    {
        Node* pNum = this->front->pNext;//指向第一个结点
        Node* pre = this->front;
        while (pNum!=NULL)
        {
            pre = pNum;
            delete pre;
            pNum = pNum->pNext;
        }
        this->front->pNext = NULL;
        this->end = this->front;
        this->size = 0;
    }

}
void CQueue::printQueue()const
{
    if (!this->isEmpty())
    {
        Node* pNum = this->front->pNext;
        while (pNum!=NULL)
        {
            cout<<pNum->data<<" ";
            pNum = pNum->pNext;
        }
        cout<<endl;
    }
}
int CQueue::Size()const
{
    return this->size;
}
bool CQueue::isEmpty()const
{
    return this->front==this->end;
}
CQueue::~CQueue(void)
{
this->clearQueue();
}


复制代码

复制代码
#include "Queue.h"
#include <iostream>
using namespace std;

void printArray(int data[],int n)
{
    int i;
    for (i=0;i<n;++i)
    {
        cout<<data[i]<<" ";
    }
    cout<<endl;
}
int getRadix(int num,int count)
{//返回num在趟数为count时的数值,0趟最后一位,趟倒数第一位,依次类推
    int temp = num,result,nCount=0;
    while(nCount<=count)
    {
        result = temp%10;
        temp = temp/10;
        nCount++;
    }
    return result;
}
void RadixSort(int data[],int n,const int count)
{//基数排序,count为趟数
    CQueue *queue = new CQueue[10];//下标从到的个队列
    int i,j,num,m;
    //
    for (i=0;i<count;++i)
    {
        //分配
        for (j=0;j<n;++j)
        {
            num = getRadix(data[j],i);//当前趟数下的基数
            queue[num].EnQueue(data[j]);
        }
        for (j=0;j<10;++j)
        {
            cout<<"队列"<<j<<":"<<endl;
            queue[j].printQueue();
        }
        
        //收集
        m = 0;
        for (j=0;j<10;++j)
        {
            while (!queue[j].isEmpty())
            {
                data[m] = queue[j].DeQueue();
                m++;
            }

        }
        cout<<"收集趟数: "<<i<<": "<<endl;
        printArray(data,n);
    }
}

void swap(int& a,int& b)
{
    int temp = a;
    a =  b;
    b = temp;
}
int minElement(int data[],int begin,int end)
{
    int result=begin,maxNum = data[begin],i;
    for (i=begin+1;i<end;++i)
    {
        if (data[i]<maxNum)
        {
            maxNum = data[i];
            result = i;
        }
    }
    return result;
}
void SelectionSort(int data[],int n)
{//选择排序
    int i,num;
    //共需要进行n-1轮
    for (i=0;i<n-1;++i)
    {
        num = minElement(data,i,n);
        swap(data[i],data[num]);
    }
}
void AdjustHeap(int data[],int begin,int end)
{//堆调整data[beginend-1]
    int tmp = data[begin];
    int c = begin*2,pos = begin;
    while(c<=end)
    {
        if (c<end&&data[c+1]>data[c])
        {
            c++;
        }
        if (data[c]>tmp)
        {
            data[pos] = data[c];
            pos = c;
            c = c*2;
            
        }
        else
            break;
    }
    data[pos] = tmp;
}
void BuildHeap(int data[],int n)
{//初始建小顶堆
    int i;
    for (i=n/2;i>0;--i)
    {
        AdjustHeap(data,i,n);
    }

}

void HeapSort(int data[],int n)
{//堆排序
    int* tdata = new int[n+1];
    int i;
    tdata[0] = -1;//第一个元素舍弃
    for (i=0;i<n;++i)
    {
        tdata[i+1] = data[i];
    }
    BuildHeap(tdata,n); //将tdata[1n]建成初始堆
    for(i=n-1;i>=1;--i)
    { //对当前无序区进行堆排序,共做n-1趟。
        swap(tdata[1],tdata[i+1]);
        AdjustHeap(tdata,1,i); //重新调整为堆
    }
    for (i=0;i<n;++i)
    {
        data[i] = tdata[i+1];
    }
    delete[] tdata;
}

void BubbleSort(int data[],int n)
{//冒泡排序
    bool isChange = true;
    int i,k;
    for (k=n-1;k>=1&&isChange==true;--k)
    {
        isChange = false;
        for (i=0;i<k;++i)
        {
            if (data[i]>data[i+1])
            {
                swap(data[i],data[i+1]);
                isChange = true;
            }
        }
    }
}

void InsertSort(int data[],int n)
{//插入排序
    int i,j,pos,num;
    for (i=1;i<n;++i)
    {
        num = data[i];
        for (j=0;j<=i-1&&data[i]>data[j];++j);
        pos = j;//插入点
        for (j=i-1;j>=pos;--j)
        {
            data[j+1] = data[j];
        }
        data[pos] = num;
    }
}
void QuickSort(int *data,int low,int high)
{//快速排序
    int pivot;
    int scanUp,scanDown;
    int mid;
    if(high-low<=0)
        return;
    else 
    {
        if(high-low==1)
        {
            if(data[high]<data[low])
                swap(data[low],data[high]);
            return;
        }
        mid = (low+high)/2;
        pivot = data[mid];
        swap(data[low],data[mid]);
        scanUp = low+1;
        scanDown = high;
        do
        {
            while(scanUp<=scanDown&&data[scanUp]<=pivot)
                scanUp++;
            while(data[scanDown]>pivot)
                scanDown--;
            if(scanUp<scanDown)
                swap(data[scanUp],data[scanDown]);
        }while(scanUp<scanDown);
        data[low] = data[scanDown];
        data[scanDown] = pivot;
        if(low<scanDown-1)
            QuickSort(data,low,scanDown-1);
        if(scanDown+1<high)
            QuickSort(data,scanDown+1,high);
    }
}
int main()
{
    int a[] = {10,32,55,41,39,12,11,15,20,19,21,22,29,25};
    int len = sizeof(a)/sizeof(int);
    cout<<"排序前:"<<endl;
    printArray(a,len);
    //RadixSort(a,len,2);
    //SelectionSort(a,len);
    //HeapSort(a,len);
    //BubbleSort(a,len);
    //InsertSort(a,len);
    QuickSort(a,0,len);
    cout<<"排序后:"<<endl;
    printArray(a,len);
    system("pause");
    return 0;
}


复制代码




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/07/18/1246322.html,如需转载请自行联系原作者
目录
相关文章
|
4天前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
35 15
|
4天前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
22天前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
44 15
|
22天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
47 12
|
13天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
20 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
2月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
70 19
|
2月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
60 2
|
3月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
2月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
3月前
|
算法 安全 C++
用 C++ 算法控制员工上网的软件,关键逻辑是啥?来深度解读下
在企业信息化管理中,控制员工上网的软件成为保障网络秩序与提升办公效率的关键工具。该软件基于C++语言,融合红黑树、令牌桶和滑动窗口等算法,实现网址精准过滤、流量均衡分配及异常连接监测。通过高效的数据结构与算法设计,确保企业网络资源优化配置与安全防护升级,同时尊重员工权益,助力企业数字化发展。
69 4