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)
ExpandedBlockStart.gifContractedBlock.gif
{
    
int i;
    
for (i=0;i<n;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        cout
<<data[i]<<" ";
    }

    cout
<<endl;
}

int getRadix(int num,int count)
ExpandedBlockStart.gifContractedBlock.gif
{//返回num在趟数为count时的数值,0趟最后一位,趟倒数第一位,依次类推
    int temp = num,result,nCount=0;
    
while(nCount<=count)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        result 
= temp%10;
        temp 
= temp/10;
        nCount
++;
    }

    
return result;
}

void RadixSort(int data[],int n,const int count)
ExpandedBlockStart.gifContractedBlock.gif
{//基数排序,count为趟数
    CQueue *queue = new CQueue[10];//下标从到的个队列
    int i,j,num,m;
    
//
    for (i=0;i<count;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
//分配
        for (j=0;j<n;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            num 
= getRadix(data[j],i);//当前趟数下的基数
            queue[num].EnQueue(data[j]);
        }

        
for (j=0;j<10;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            cout
<<"队列"<<j<<":"<<endl;
            queue[j].printQueue();
        }

        
        
//收集
        m = 0;
        
for (j=0;j<10;++j)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
while (!queue[j].isEmpty())
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                data[m] 
= queue[j].DeQueue();
                m
++;
            }


        }

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

}


void swap(int& a,int& b)
ExpandedBlockStart.gifContractedBlock.gif
{
    
int temp = a;
    a 
=  b;
    b 
= temp;
}

int minElement(int data[],int begin,int end)
ExpandedBlockStart.gifContractedBlock.gif
{
    
int result=begin,maxNum = data[begin],i;
    
for (i=begin+1;i<end;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
if (data[i]<maxNum)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            maxNum 
= data[i];
            result 
= i;
        }

    }

    
return result;
}

void SelectionSort(int data[],int n)
ExpandedBlockStart.gifContractedBlock.gif
{//选择排序
    int i,num;
    
//共需要进行n-1轮
    for (i=0;i<n-1;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        num 
= minElement(data,i,n);
        swap(data[i],data[num]);
    }

}

void AdjustHeap(int data[],int begin,int end)
ExpandedBlockStart.gifContractedBlock.gif
{//堆调整data[beginend-1]
    int tmp = data[begin];
    
int c = begin*2,pos = begin;
    
while(c<=end)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
if (c<end&&data[c+1]>data[c])
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            c
++;
        }

        
if (data[c]>tmp)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            data[pos] 
= data[c];
            pos 
= c;
            c 
= c*2;
            
        }

        
else
            
break;
    }

    data[pos] 
= tmp;
}

void BuildHeap(int data[],int n)
ExpandedBlockStart.gifContractedBlock.gif
{//初始建小顶堆
    int i;
    
for (i=n/2;i>0;--i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        AdjustHeap(data,i,n);
    }


}


void HeapSort(int data[],int n)
ExpandedBlockStart.gifContractedBlock.gif
{//堆排序
    int* tdata = new int[n+1];
    
int i;
    tdata[
0= -1;//第一个元素舍弃
    for (i=0;i<n;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        tdata[i
+1= data[i];
    }

    BuildHeap(tdata,n); 
//将tdata[1n]建成初始堆
    for(i=n-1;i>=1;--i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
//对当前无序区进行堆排序,共做n-1趟。
        swap(tdata[1],tdata[i+1]);
        AdjustHeap(tdata,
1,i); //重新调整为堆
    }

    
for (i=0;i<n;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        data[i] 
= tdata[i+1];
    }

    delete[] tdata;
}


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

        }

    }

}


void InsertSort(int data[],int n)
ExpandedBlockStart.gifContractedBlock.gif
{//插入排序
    int i,j,pos,num;
    
for (i=1;i<n;++i)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        num 
= data[i];
        
for (j=0;j<=i-1&&data[i]>data[j];++j);
        pos 
= j;//插入点
        for (j=i-1;j>=pos;--j)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            data[j
+1= data[j];
        }

        data[pos] 
= num;
    }

}

void QuickSort(int *data,int low,int high)
ExpandedBlockStart.gifContractedBlock.gif
{//快速排序
    int pivot;
    
int scanUp,scanDown;
    
int mid;
    
if(high-low<=0)
        
return;
    
else 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
if(high-low==1)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
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
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
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()
ExpandedBlockStart.gifContractedBlock.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
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;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

朋友圈终于能斗表情包了,会发表情包您就多发点!

全世界只有3.14 % 的人关注了青少年数学之旅今日&#xff0c;微信ios端更新至7.0.9版本&#xff0c;又上了一次微博热搜。版本新增了朋友圈图片评论功能&#xff0c;动态图、静态图均可&#xff0c;点击图片评论即可查看大图&#xff0c;评论图片同步聊天表情包库。各路网友收到…

EF Core 异步编程注意要点

????欢迎点赞 &#xff1a;???? 收藏 ⭐留言 ???? 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;????本文作者&#xff1a;由webmote 原创&#xff0c;????作者格言&#xff1a;生活在于折腾&#xff0c;当你不折腾生活时&#x…

看电影的第一大禁忌 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源网络&#xff0c;侵权删&#xff09;

求职华为,被问观察者模式,从没有这种体验!!!

求职华为&#xff0c;被问观察者模式&#xff0c;从没有这种体验&#xff01;&#xff01;&#xff01;模式的定义与特点模式的结构与实现1. 模式的结构2. 模式的实现模式的应用实例模式的应用场景模式的扩展1. Observable类2. Observer 接口[ 观察者模式可以说是非常贴近我们…

SQL2005的配置

最近迷上c#&#xff0c;下午装好了SQL server management studio Express 附加经典的northwind数据库 然后用下面一段代码测试 1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Text;4usingSystem.Data;5usingSystem.Data.Sql;6usingSystem.Data.SqlClient;78name…

为什么应该用record来定义DTO(续)

前言上次&#xff0c;我们介绍了因为DTO的“不变性”&#xff0c;应该用record来定义DTO。今天&#xff0c;我们来说明用record来定义DTO的另一个好处。问题首先&#xff0c;我们实现一个Controler&#xff0c;代码如下:[ApiController] [Route("[controller]")] pub…

资料分享 | 数学建模竞赛备战大全

全世界只有3.14 % 的人关注了青少年数学之旅目前针对数学建模的认知&#xff0c;绝大部分人还停留在数学建模竞赛阶段&#xff0c;并不知道数学建模是数据领域非常重要的一种方法。数学建模涉及的内容广泛&#xff0c;比如碎纸片问题中所涉及的图像识别及神经网络、小区开放问题…

初级Java开发工程师!绝密文档,面试手册全面突击!!!秋招已经到来

这里我要明说一下&#xff0c;不是Java初级和学习Java的千万不要乱看&#xff0c;否则~~~~ 你会怀疑人生&#xff0c;因为会浪费你时间啊&#xff01;&#xff01;&#xff01; 本次考点是Java初级开发工程师面试必备的一些东西!!! 1、数据类型 基本类型 byte/8、short/16、…

数学2600年,欧拉凭什么能当上“大王”?

全世界只有3.14 % 的人关注了青少年数学之旅何为数学&#xff1f;♠音乐家说&#xff0c;数学是世界上最和谐动听的音符♥植物学家说&#xff0c;世界上没有比数学更美的花朵♣美学家说&#xff0c;哪里有数学&#xff0c;哪里才有真正的美♦哲学家说&#xff0c;世界什么都在变…

NET流行高性能JSON框架-Json.NET

在日常编程中经常会使用到Json来进行数据的交互好在.Net平台下有很多开源的Json库使得我们能够比较轻松快速的处理各种复杂的Json&#xff0c;其中Newtonsoft库是NET的流行高性能JSON框架特性工具VS2010Newtonsoft库从NuGet下载合适的Newtonsoft.Json库1.在你需要引用Newtosoft…

Scribefire发CSDN博客

历史在非常久非常久曾经&#xff0c;CSDN是支持外部工具来写文章的&#xff0c;但是在还有一个非常久非常久曾经就不行了。突然看到CSDN有能够用外部工具来写博客了&#xff08;CSDN的公告&#xff09;&#xff0c;一直以来都纠结这个问题&#xff0c;CSDN的编辑器不好用&#…

今日笔记!——分析Java应用性能

1 问题描述 因产品架构的复杂性&#xff0c;可能会导致性能问题的因素有很多。根据部署架构&#xff0c;大致的可以分为应用端瓶颈、数据库端瓶颈、环境瓶颈三大类。可以根据瓶颈的不同部位&#xff0c;选择相应的跟踪工具进行跟踪分析。 应用层面瓶颈大致有如下两类&#xf…

除了PS,还有它可以轻松实现图像处理!

全世界只有3.14 % 的人关注了青少年数学之旅在我们生活中&#xff0c;常见的图像处理软件有Adobe Photoshop、Adobe Illustrator等。然而&#xff0c;并非只有软件才能实现图像处理&#xff0c;通过编程手段也是能实现的&#xff01;今天&#xff0c;小天将要带着大家走进计算机…

微服务并不能解决你的烂代码问题

点击上方蓝字关注我们“微服务并不能解决你的烂代码问题很久以来&#xff0c;软件的交付质量一直是一个大家比较关心的问题&#xff0c;而程序员和架构师也一直在极力寻找一种更好的方式来构建应用系统。随着互联网爆炸式的增长&#xff0c;对于系统的交付速度和质量的要求也日…

protobuf在java应用中通过反射动态创建对象

2019独角兽企业重金招聘Python工程师标准>>> ---恢复内容开始--- 最近编写一个游戏用到protobuf数据格式进行前后台传输&#xff0c;苦于protobuf接受客户端的数据时是需要数据类型的如xxx.parseForm(...),这样就要求服务器在接受客户端请求时必须知道客户端传递的数…

黑科技轮胎:有能发电的,脑洞简直不要太大...

全世界只有3.14 % 的人关注了青少年数学之旅人类历史上的很多伟大发明&#xff0c;都是由脑洞产生的&#xff0c;这样那样&#xff0c;然后问题就解决了&#xff0c;过程很复杂&#xff0c;却又很简单&#xff0c;甚至有时候&#xff0c;是一种很奇葩的方式。在漫长的历史进程中…

VS 2019 16.11正式发布 | 新功能(Hot Reload 热重载)试用

VS 2019 16.11VS 2019 16.11已于2021.8.10正式发布。&#xff08;https://devblogs.microsoft.com/visualstudio/visual-studio-16-11/&#xff09;这个版本主要包括以下内容&#xff1a;Visual Studio中的Git工具体验改进支持.NET应用程序的Hot Reload&#xff08;热重载&…

测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~

懒的搞什么开头了&#xff0c;直接撸代码吧 想了想还是给大家看看学姐照片吧&#xff0c;保持眼睛的明亮&#xff0c;代码敲多了&#xff0c;伤眼 1&#xff1a; 作StringBuilder与String的拼接比较 Test public void testString () {String s"";long begin S…

厉害了!这里藏着通关学霸的秘籍

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

『 编程思维』之我见

编程思维&#xff0c;对于一个开发人员来说是必备的&#xff0c;但凡能让应用跑起来&#xff0c;不管应用的大小&#xff0c;优劣&#xff0c;说明这个开发人员都具有编程思维&#xff0c;毕竟程序认可了这个开发人员逻辑&#xff0c;能启动起来。小到几行代码&#xff0c;一个…