算法分析与设计---排序

算法分析与设计——排序算法效率的比较 本文主要是比较冒泡排序、选择排序、 希尔排序、快速排序,这四种不同的排序过程的运行时间。 为了消除数据之间差异导致排序效果的影响,四种排序均使用相同的数组进行排序。为了使运行时间的结果差异更明显,数组长度设为100000(为了防止数组长度溢出,如果使用数组的话,建议定义全局变量。或者使用堆栈、vector等动态内存分配),数组元素取值范围是在[0, 100000]之间的随机正整数。 冒泡排序: void BubbleSort(long int a[],int len){//冒泡排序 for(int 阅读详情

2010年冬天上课,老师留的作业要求课后上机实现排序的算法,现在一年半已经过去了。


#include <iostream>
using namespace std;
#include <stdlib.h>
#include <time.h>
#define random(x)(rand()%(x))
#define N 10000

class timer//单位ms
{
      public:
             void start()
             {
                  start_t=clock();
             }
             clock_t time()
             {
                  return (clock()-start_t);
             }
      private:
              clock_t start_t;
};

timer TIMER;

/*--------------------------直接插入排序----------------------*/ 
void InsertSort(int a[])
{
     TIMER.start();
     for(int i=1; i<N; i++)
     {
             int temp=a[i];
             int j;
             for(j=i; j>0&&temp<a[j-1]; j--)
             a[j]=a[j-1];
             a[j]=temp;
     }
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;    
}
/*--------------------------直接插入排序-----------------------*/

/*--------------------------希尔排序---------------------------*/  
void ShellSort(int a[])
{
     TIMER.start();
     for(int gap=N/2; gap; gap=gap/2)
             for(int i=gap; i<N; i++)
             {
                     int temp=a[i];
                     int j;
                     for(j=i; j>=gap&&temp<a[j-gap]; j-=gap)
                     a[j]=a[j-gap];
                     a[j]=temp;
             }
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;  
}
/*--------------------------希尔排序--------------------------*/ 

/*--------------------------冒泡排序--------------------------*/ 
void BubbleSort(int a[])
{
     TIMER.start();
     //bool exchange=true;
     for(int i=1; i<N; i++)
             for(int j=N-1; j>=i; j--)
             {
                        //exchange=false;
                        if(a[j-1]>a[j])
                        {
                                   swap(a[j-1],a[j]);
                                   //exchange=true;
                        }
             }
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl; 
}
/*--------------------------冒泡排序--------------------------*/ 

/*--------------------------快速排序--------------------------*/ 
int Partition(int a[], int low, int high)
{
    //a[0]=a[low];
    int pivotkey=a[low];
    while(low<high)
    {
                   while(low<high&&a[high]>=pivotkey)
                   --high;
                   a[low]=a[high];
                   while(low<high&&a[low]<=pivotkey)
                   ++low;
                   a[high]=a[low];
    }
    //a[low]=a[0];
    a[low]=pivotkey;
    return low;
}

void QSort(int a[], int low, int high)
{
     if(low<high)
     {
                 int pivotloc=Partition(a, low, high);
                 QSort(a, low, pivotloc-1);
                 QSort(a, pivotloc+1, high);
     }
}

void QuickSort(int a[])
{
     TIMER.start();
     QSort(a, 0, N-1);
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;
}
/*--------------------------快速排序--------------------------*/

/*------------------------直接选择排序------------------------*/
void SelectSort(int a[])
{
     TIMER.start();
     for(int i=0; i<N; i++)
     {
             int j, k;
             for(j=i+1, k=i; j<N; j++)
                        if(a[j]<a[k])
                        k=j;
             if(k!=i)
             swap(a[k],a[i]);
     }
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;
}
/*------------------------直接选择排序------------------------*/

/*---------------------------堆排序---------------------------*/
void HeapAdjust(int a[], int i, int n)
{
     int child=2*i+1;
     int temp=a[i];
     while(child<n)
     {
                   if(child<n-1&&a[child]<a[child+1])
                   child++;
                   if(temp>=a[child])
                   break;
                   a[i]=a[child];
                   i=child;
                   child=2*i+1;
     }
     a[i]=temp;
}

void HeapSort(int a[])
{
     TIMER.start();
     int i;
     for(i=(N-2)/2; i>=0; i--)
                 HeapAdjust(a, i, N);
     for(i=N-1; i>0; i--)
     {
                swap(a[0],a[i]);
                HeapAdjust(a, 0, i);
     }
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;
}
/*---------------------------堆排序---------------------------*/

/*--------------------------归并排序--------------------------*/
void Merge(int a[], int p, int q, int r)
{
     int* temp=(int*)malloc((r-p+1)*sizeof(int));
     int begin1, begin2, end1, end2, k;
     begin1=p;
     end1=q;
     begin2=q+1;
     end2=r;
     k=0;
     while((begin1<=end1)&&(begin2<=end2))
     {
                                        if(a[begin1]<a[begin2])
                                        {
                                                   temp[k]=a[begin1];
                                                   begin1++;
                                        }
                                        else
                                        {
                                                   temp[k]=a[begin2];
                                                   begin2++;
                                        }
                                        k++;
     }
     while(begin1<=end1)
     {
            temp[k++]=a[begin1++];
            //k++;
            //begin1++;
     }
     while(begin2<=end2)
     {
                       temp[k++]=a[begin2++];
                       //k++;
                       //begin2++;
     }
     for(k=0; k<(r-p+1); k++)
     a[p+k]=temp[k];
     free(temp);
}

void MSort(int a[], int first, int last)
{
     //TIMER.start();
     int mid=0;
     if(first<last)
     {
                   mid=(first+last)/2;
                   MSort(a, first, mid);
                   MSort(a, mid+1, last);
                   Merge(a, first, mid, last);
     }
     //cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;
}

void MergeSort(int a[])
{
     TIMER.start();
     MSort(a, 0, N-1);
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;
}
/*--------------------------归并排序--------------------------*/

/*--------------------------基数排序--------------------------*/
/*
void RadixSort(int a[])
{
    TIMER.start();
    int i, j, k, n, lsd;
    int temp[N][N]={0};
    int order[N]={0};
    n=1;
    k=0;
    while(n<=10000)//对于随机数怎样确定n的范围取值 
    {
                    for(i=0; i<N; i++)
                    {
                             lsd=((a[i]/n)%10);
                             temp[lsd][order[lsd]]=a[i];
                             order[lsd]++;
                    }
                    for(i=0; i<N; i++)
                    {
                             if(order[i]!=0)
                                            for(j=0; j<order[i]; j++)
                                            {
                                                     a[k]=temp[i][j];
                                                     k++;
                                            }
                                            order[i]=0;
                    }
                    n*=10;
                    k=0;
     }
     cout<<"\tTimeSpared:"<<TIMER.time()<<"ms"<<endl;
}
*/                    
/*--------------------------基数排序--------------------------*/
int main()
{
    int i;
    int* ascending=new int[N];//升序序列
    int* descending=new int[N];//降序序列
    int* randomness=new int[N];//随机序列
    for(i=0; i<N; i++)
    {
              ascending[i]=i;
              randomness[i]=i;
              descending[i]=N-i-1;
    }
    for(i=0; i<N; i++)
              swap(randomness[i],randomness[random(N)]);
              
    cout<<"-------------直接插入排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;InsertSort(ascending);
    cout<<"Sort randomness N="<<N;InsertSort(randomness);
    cout<<"Sort descending N="<<N;InsertSort(descending);
   
    cout<<"-------------希尔排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;ShellSort(ascending);
    cout<<"Sort randomness N="<<N;ShellSort(randomness);
    cout<<"Sort descending N="<<N;ShellSort(descending);
    
    cout<<"-------------起泡排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;BubbleSort(ascending);
    cout<<"Sort randomness N="<<N;BubbleSort(randomness);
    cout<<"Sort descending N="<<N;BubbleSort(descending);
   
    cout<<"-------------快速排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;QuickSort(ascending);
    cout<<"Sort randomness N="<<N;QuickSort(randomness);
    cout<<"Sort descending N="<<N;QuickSort(descending);
    
    cout<<"-------------直接选择排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;SelectSort(ascending);
    cout<<"Sort randomness N="<<N;SelectSort(randomness);
    cout<<"Sort descending N="<<N;SelectSort(descending); 
    
    cout<<"-------------堆排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;HeapSort(ascending);
    cout<<"Sort randomness N="<<N;HeapSort(randomness);
    cout<<"Sort descending N="<<N;HeapSort(descending);
    
    cout<<"-------------归并排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;MergeSort(ascending);
    cout<<"Sort randomness N="<<N;MergeSort(randomness);
    cout<<"Sort descending N="<<N;MergeSort(descending);
    /*
    cout<<"-------------基数排序-------------"<<endl; 
    cout<<"Sort ascending N="<<N;RadixSort(ascending);
    cout<<"Sort randomness N="<<N;RadixSort(randomness);
    cout<<"Sort descending N="<<N;RadixSort(descending);
    */
}



Windows-Anaconda3+TensorFlow安装教程 测试环境:win10-64位和win7-64位 (系统必须是64位,因为TensorFlow目前只支持64位) 一、安装Anaconda3 1.下载Anaconda3 Anaconda官网链接:link 这里我们选择Windows版本,python3.6-version-64位,如下图所示。 2.下载完成之后,点击安装Anaconda3 注意:安装过程中要选择添加环境变量,如图 待安装完成... 阅读详情

相关推荐

手把手教你使用ESM-2进行蛋白质结构预测:从安装到实战

本文详细介绍了如何使用ESM-2蛋白质语言模型进行蛋白质结构预测,从环境准备、模型安装到实战应用。通过逐步指导,读者可以掌握ESM-2的配置、单序列预测、结果可视化及高级优化技巧,适用于生物信息学研究和药物开发。

weixin_29306875的博客 534

【算法设计与分析】排序算法性能分析

由本次实验可知,效率较高的排序算法为快速排序和合并排序,两者效率非常接近,其他三种排序算法效率较低,其中选择排序和插入排序效率较为接近。此外,五种排序算法的实际运行效率和理论运行效率曲线基本吻合,可以推测选择排序、冒泡排序、插入排序的时间复杂度为O(n²),合并排序、快速排序的时间复杂度为O(nlogn)

b1ngsha的博客 937

DEV-C++调试设置

       昨天用C/C++去考了CSP,结果用DEV-C++调试总是闪退,按照我的记忆打开了调试参数,迷迷糊糊搞了一通,还是没办法调试,难受了几个小时。所以今天痛下决心,一定要写下DEV-C++设置调试的过程,警示自己! 解决步骤 1.打开DevC++找到上方工具栏 2.点击选择编译选项,再按下图所示设置即可

懒羊羊的快乐小屋 1029

算法分析与设计 八大排序算法

八大排序算法八大排序分类01 冒泡排序02 直接插入排序03 简单选择排序04 希尔排序05 快速排序06 堆排序07 归并排序08 桶排序/基数排序参考资料 八大排序分类 ​ 笔者是在LeetCode刷题过程中来复习排序算法的,虽然在刷题中我们可以使用高级编程语言提供封装好的排序算法便捷实现排序任务,例如 C++ 里可以通过 STL 中基于快速排序实现的 std::sort() 算法便捷实现排序任务。而且刷题时除非题目考点就是排序算法,否则也不建议自己手写排序算法。 ​ 但是知识都是有着累积发展的过程,我

王清欢的博客 4166

C++碰撞检测库FCL安装(MinGW,CMake)

FCL碰撞检测库、libccd\Eigen库编译配置,全流程问题记录

weixin_45650767的博客 4675

从CCS3.3到CCS10:工程迁移与开发环境升级全攻略

本文详细介绍了从CCS3.3迁移到CCS10的完整流程与实战指南。针对老旧DSP项目,阐述了升级的必要性,并逐步指导CCS10的安装配置、界面操作、核心的工程移植步骤,以及移植后常见的代码调整与问题解决方案,帮助开发者高效完成开发环境升级,充分利用新版本的工具链提升开发效率。

weixin_29304985的博客 378

算法设计与分析——简单的排序算法(冒泡排序,选择排序,插入排序)

1.Comparable接口 在实际应用中,我们对一些数据进行排序,通常不会是某个单独的数字,比如根据学生的年龄对学生排序、根据商品的价格对商品进行排序等等,这时我们排序操作的就是一个对象,Java提供了一个接口Comparable就是用来定义排序规则的。 实例:定义一个学生类Student,具有姓名name和年龄age两个属性,通过Comparable接口提供比较规则。 package learn; class Student implements Comparable<Student&g

qq_57633498的博客 1283

SpringBoot+Vue前后端分离项目实战:个人博客系统

MyBlog主要是基于 SpringBoot + Vue 前后端分离开发的一款动态个人博客系统,后台和前台均通过JSON数据做交互,主要功能有文章管理、分类管理、标签管理、附件管理、评论管理、友链管理、个人资料/博客信息管理等。

Myles'Blog 1万+

算法分析与设计:10 大排序算法大汇总(Java)

算法分析与设计:10 大排序算法大汇总(Java)

SongXJ的博客 1012

PDN设计

作者:AirCity 2020.2.6 Aircity007@sina.com 本文所有权归作者Aircity所有 PDN设计的目的是降低电源纹波水平,减小电压跌落。我们通常要求LDO的文波水平是30mV,DCDC是50mV,超过这个就需要PDN设计。 PDN设计的方法是用不同的容值,合适的总电容量,降低电源平面与地平面之间的交流阻抗,确定容值总量和电容大小的过程,就是PDN设计过程。 为什么需...

AirCity123的博客 4147

基于Simulink的BCH码编解码仿真建模示例

BCH码是一类循环码,能够纠正一定数量的随机错误。灵活性:可以根据需要选择不同的码长和纠错能力。高效性:适用于短码长和中等码长的场景,广泛用于卫星通信、存储系统等。实现简单:编码和解码过程可以通过硬件或软件高效实现。在本示例中,我们将使用MATLAB/Simulink中的和模块来完成BCH码的编解码操作,并通过仿真验证其误码率(BER)性能。通过本指南,我们介绍了如何基于Simulink搭建一个BCH码的编解码模型,并进行了仿真以验证其性能。背景介绍:理解BCH码的基本原理及其在通信系统中的应用。

xiaoheshang_123的博客 191

算法分析与设计实验1:实现两路合并排序和折半插入排序

本文比较分析了两路合并排序和折半插入排序两种算法。两路合并排序采用分治策略,通过递归分解和合并实现排序,时间复杂度稳定为O(nlogn);折半插入排序则在传统插入排序基础上引入二分查找优化,时间复杂度介于O(nlogn)到O(n²)之间。实验结果显示,两路合并排序成功将测试数组[8,4,2,3,5,1,6,9,0,7]排序为升序,折半插入排序则正确排序了数组[4,1,3,5,4,2]。两种算法各具特点,适用于不同排序需求场景。

qq_1293730064的博客 1180

基于YOLO的印章检测及文字识别

针对印章自动化检测与文字识别需求,提出了一种融合改进YOLO模型与OCR技术的端到端解决方案,旨在解决复杂背景干扰、印章残缺变形及环形文字排列等难题

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 8224

【算法分析与设计】链表排序

找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2 步,慢指针每次移动 1 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。递归的终止条件是链表的节点个数小于或等于 111,即当链表为空或者链表只包含 111 个节点时,不需要对链表进行拆分和排序。将两个排序后的子链表合并,得到完整的排序后的链表。可以使用「21. 合并两个有序链表」的做法,将两个有序的子链表进行合并。对链表自顶向下归并排序的过程如下。对两个子链表分别排序。

m0_62645012的博客 841

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

算法分析与设计作业二——快速排序

基本思想: 任取一个元素(如第一个)为中心 所有比它小的元素一律往前放,比它大的元素一律后放,形成左右两个子表; 对各个子表重新选择中心元素并依次规则调整,直到每个子表的元素只剩下一个; 每一趟的子表的形式是采用从两头向中间交替式逼近法; 由于每趟中各子表的操作都相似,可采用递归算法; ①首先拿49作为哨兵元素,自始至终都是high先从右向左移,即j--;找到比49小的元素27时停止;将...

麦穗的博客 613

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

算法分析与设计笔记——排序算法

等等waiting 197

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法分析与设计实验 分治策略 两路合并排序和快速排序

实验目的 理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序, 加深对分治法 的算法原理及实现过程的理解。 实验内容 用分治法实现一组无序序列的两路合并排序和快速排序。要求清楚合并排序及快速排序 的基本原理, 编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。 实验代码: //分治法实现两路合并排序和快速排序 //包含所需各种头文件 #inc

Yesterday You Said Tomorrow. 6106

【五十】【算法分析与设计】快速排序和归并排序

1.快速排序和归并排序都是递归排序。2.快速排序的递归内部逻辑,只做一小步,这一小步是,随机获取key值,将元素值为key值的元素放到排序的正确位置。然后左边排序,右边排序。3.归并排序的递归内部逻辑,只做一小步,将已经排序好的区间[left,mid][mid+1,right]合并成一个排序的区间。

m0_74163972的博客 640

算法分析与设计 二分归并排序

算法分析与设计 二分归并排序 问题描述: 对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。 算法思路: 每次用分治的思想将数组进行二分操作,然后从下往上开始进行合并排序。 核心代码: if p<r then q<-(p+r)/2 mergesort(a,p,q) mergesort(a,q+1,r) merge(a,p,q,r) 时间复杂度: 设n=...

Erwin_Cat的博客 945

算法分析与设计第三章——(排序算法)

蛮力排序:冒泡,插入,选择排序 分治排序算法:树形选择排序、快速排序、归并排序、堆排序、计数排序、桶排序 一系列问题

m0_64056556的博客 1238

【算法分析与设计】第二章 排序

1.1、选择、冒泡、插入排序 a、选择排序 算法描述 1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 3.重复第二步,直到所有元素均排序完毕。 时间复杂度: O(N^2),空间复杂度: O(1) 代码 template<typename T> //整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(>)的運算子功能 void selection_sort(std::vector

Yirschen的博客 310

算法分析与设计——快排和插入排序的实现

import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStr

Emily_cyy的专栏 882

算法分析与设计:快速排序

快速排序(Quick Sort) 基于分治策略。 核心思想:递归地将待排数组分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 步骤: 分解:以 a[start]a[start]a[start] 为基准元素,将 a[start,end]a[start,end]a[start,end] 划分成3段(a[start,q−1],a[q],a[q+1,end]a[start,q-1], a[q],a[q+1,end]a[start,q−

SongXJ的博客 1472

算法分析与设计CH8:线性时间的排序——计数排序、基数排序、桶排序

计数排序、基数排序、桶排序三大线性时间排序算法详解。各类排序算法总结

weixin_45745854的博客 331

算法分析与设计——2.2快速排序

问题描述:对一个无序的数组以从小到大的顺序进行排序。 算法思想:快速排序算法的思想是 分解——递归求解——合并 分解:以a[p]为基准元素将a[p:r]划分为3段a[p:q-1],a[q]和a[q+1:r],使a[p:q-1]中的元素都小于等于a[q],a[q+1:r]中的元素都大于等于a[q]。下标q在划分过程中确定。 递归求解:递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]这两段数据进行排序。 合并:第二步完成后,不需要再执行任何计算,a[p:r]已排好序。 正如第一步中所说的,

ray_kong的博客 913

算法分析与设计 第一章 搜索、排序

第一章第一节搜索 /** * 线性搜索 * @param a数组名 * @param key带搜索的关键字 * @return 关键字在数组的索引:若不存在,则返回-1 */ int LinearSearch(int a[],int key) { for(int i=0;i<a.length;i++) { if(key==a[i]) { return ...

QvQWangXiaoBao的博客 272
上一篇: 第九章 代码调优
下一篇: 第十一章 排序
ProfessionalEngineer
博客等级 码龄19年 295粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值