算法学习笔记(三)-----各种基础排序问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、直接插入排序:是最简单的排序方法,算法简单来说就是可以把第一个数a[0]看做有序数组,那么a[1]要插入进来,对比,插入合适位置;然后a[0],a[1]是有序数组,插入a[2]就依次和a[0],a[1]比较并插入,若a[2]需插在最前面,那a[0],a[1]都要依次后移。。。以此类推。所以插入排序有很多比较及交换的过程。时间复杂度为O(n2)。下面是自己编的插入排序的代码,很简单嗯:

void InsertSort(int *a,int length)

{

int temp=0;

for(int i=1;i<length;i++)

{

for(int j=0;j<i;j++)

{

if(a[i]<a[j])

{

temp=a[i];

a[i]=a[j];

a[j]=temp;

}

}

}

}

二、希尔排序:也是一种插入排序,但是用简单的算法有了大的复杂度改进。简单来说就是设置了一个增量表K[]。比如有一个10个数字的数组需要排序的话,可以把增量表设置成K[3]={5,3,1}。先以增量5排序,就是把10个数字数组分区成为{R1,R6};{R2,R7};{R3,R8};{R4,R9};{R5,R10}.区域内各自使用插入排序,然后再以增量3排序,最后一定要用增量1排序,确认整体的顺序正确。这样可以因为小区域内的简单排序,确保整个数组”基本有序“,最后再进行一次校验,校验的时候就不需要过多的交换而浪费时间。但是希尔排序的复杂度很难分析,和增量序列也有关系。姑且记住当增量序列dlta[k]=2t-k+1-1时,其复杂度为On3/2)。

void ShellSort(int *array,int *dk,int length)

{

for(int i=0;i<sizeof(dk);i++)

{

       ShellFastSort(array,dk[i],length);

}

}

void ShellFastSort(int *a,int k, int len)

{

int temp;

for(int i=0;i<k;i++)

{

for(int j=i+k;j<len;j+=k)

{

for(int m=i;m<j;m+=k)

if(a[m]>a[j])

{

temp=a[j];

a[j]=a[m];

a[m]=temp;

}

}

}

}

三、冒泡排序:经典排序算法,交换的思想。数与数依次比较,大的就往后移,第一趟排序能把最大的数交换到最后一个位置,第二趟把第二大的数字交换到倒数第二的位置。。。时间复杂度还是On2.

    for(int j=n;j>0;j--)

         {

                   for(int i=1;i<j;i++)

                   {

                            if(array[i-1]>array[i]){

                     temp=array[i];

                    array[i]=array[i-1];

                     array[i-1]=temp;

                            }

                   }

         }

四、快速排序:是对冒泡排序的改进,思想简单来说,一趟排序把数字分成大数字区域和小数字区域,间隔点也就是所谓的“枢轴(pivot)“可任意选。通常把第一个数字作为枢轴,划分成两个区域后,再各自划分,不断递归,最后就剩两个或三个数字的区域,就很简单就能排列出来了。(不过代码还是稍微纠结了一下才写出来啊。。。)栈的最大深度可降为Ologn

void FastSort(int *a,int low,int high)

{

         int pivotloc=0;

         if(low<high){

             pivotloc=partition(a,low,high);

                   FastSort(a,low,pivotloc-1);

                   FastSort(a,pivotloc+1,high);

         }

}

int partition(int *a,int low,int high)

{

         int pivotkey=a[low],temp;

         while(low<high){

                   while(low<high&&a[high]>=pivotkey){high--;}

             if(low<high)

                            a[low++]=a[high];

                   while(low<high&&a[low]<=pivotkey){low++;}

        if(low<high)

                            a[high--]=a[low];

         }

         return low;

}


转载于:https://my.oschina.net/u/1475850/blog/221772

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

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

相关文章

mac之把打开终端设置快捷键为Ctrl+Alt+T

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程 1、在Automator.app中创建一个AppleScript Finder&#xff0d;>应用程序->Automator打开Automator.app&#xff0c;打开Automator后…

基础磁盘管理

一、设备文件Linux中设备类型分为字符设备与块设备&#xff0c;他们特点分别为&#xff1a;块设备特性&#xff1a;以“块”为单位进行存取&#xff0c;随机访问&#xff0c;例如磁盘字符设备特性&#xff1a;以“字节”单位进行存取&#xff0c;线性访问&#xff0c;例如键盘设…

redhat yum 安装 mysql_Redhat 7 下Mysql8.0.19安装配置图文详解(配合使用 centos YUM源)...

MySQL Database Service数据库服务器具有以下特点&#xff1a; 具有分析引擎的MySQL数据库服务&#xff1a; MySQL数据库服务是一项完全托管的数据库服务&#xff0c;可使用世界上最受欢迎的开源数据库来部署云原生应用程序。MySQL Analytics Engine将性能提高了400倍。 MySQL企…

Elasticsearch数据库

什么是ElasticsearchElasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。…

mac之自己摸索的常用快捷键总结

开终端设置快捷键为&#xff1a; CtrlAltT why click here http://blog.csdn.net/u011068702/article/details/63685920 页面最大化&#xff1a; Ctrl Command F 页面最大化后缩小为中等页面&#xff1a; Ctrl Command F 页面最小化&#xff1a; Command M 恢复最…

HTML5 Canvas 画纸飞机组件

纸飞机模拟一个物体在规定设计轴线偏离方位。 1 //三角形2 function DrawTriangle(canvas, A, B, C) {3 //画个三角形,“A、B、C”是顶点4 with (canvas) {5 moveTo(A[0], A[1]);6 lineTo(B[0], B[1]);7 lineTo(C[0], C[1]);8 lineTo(…

[tools]notepad++当前文件路径不是工作路径

Time:2015/04/09 描述&#xff1a; 在notepad中运行lua&#xff0c;工作路径不是当前文件的路径&#xff0c;而是notepad的安装目录 修改&#xff1a; 把差将中的NppExec --> Follow $(CURRENT_DIRECTORY)勾上即可 参考&#xff1a; [1]http://bbs.chinaunix.net/thread-407…

OPPO R9凭创新赢得2000万销量,成2016年热销手机

2016年的手机市场虽然新闻不断但是整体状况并没有以往那么好&#xff0c;各方数据显示&#xff0c;2016年全年全球智能型手机出货量仅有2.3%的微幅增长&#xff0c;虽然中国市场的全年出货量通同比增长6%&#xff0c;但是比往年也大有不如&#xff0c;手机市场已从增量市场进入…

windows7 nginx php mysql_windows7配置Nginx+php+mysql的详细教程

最近在学习php&#xff0c;想把自己的学习经历记录下来&#xff0c;并写一些经验&#xff0c;仅供参考交流。此文适合那些刚刚接触php&#xff0c;想要学习并想要自己搭建Nginxphpmysql环境的同学。当然&#xff0c;你也可以选择集成好的安装包&#xff0c;比如 wamp等&#xf…

基于C#的计时管理器

问题我们使用各种系统时候会遇到以下问题&#xff1a;12306上购买火车票如果15分钟内未完成支付则订单自动取消。会议场馆预定座位&#xff0c;如果10分钟内未完成支付则预定自动取消。在指定时间之后&#xff0c;我需要执行一项任务。我之前做的很多系统&#xff0c;往往都是定…

C语言之malloc和free总结

1、内存分配和函数介绍 内存分配:指在程序执行的过程空间中或者回收存储空间 ,内存分配分为静态内存分配和动态内存分配 ,要实现动态内存分配,就需要有执行这个操作的对象。C语言提供的两个标准库函数:malloc和free。 1)malloc函数 原型:void *malloc(size_t size)…

哈希表(hashtable)的javascript简单实现

javascript中没有像c#,java那样的哈希表(hashtable)的实现。在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的方法就可以实现简单高效的hashtable。 首先简单的介绍关于属性的一些方法&#xff1a; 属性的枚举: for/in循环是遍历对…

HDU 2516 (Fabonacci Nim) 取石子游戏

这道题的结论就是&#xff0c;石子的个数为斐波那契数列某一项的时候&#xff0c;先手必败&#xff1b;否则&#xff0c;先手必胜。 结论很简单&#xff0c;但是证明却不是特别容易。找了好几篇博客&#xff0c;发现不一样的也就两篇&#xff0c;但是这两篇给的证明感觉证得不清…

access的ole对象换成mysql_ACCESS的Ole对象读取写入

Ole对象在Access中存储为二进制文件&#xff0c;读取的时候需要注意转换出的文件的编码格式1OleDbConnection OleConnnewOleDbConnection();2OleConn.ConnectionString"ProviderMicrosoft.Jet.OleDb.4.0;data sourceD:\WorkStation\Dialy_Sol\Dialy\Dialy.mdb";3OleD…

C++之delete常见错误总结

1、动态分配内存后释放了一次,再次释放 1)直接删除2次 int main() {int *a = new int(50);cout<<*a<<endl;delete a;delete a;return 0; } 2)另外一个指针指向分配的内存,然后把这个2个指针都删除 int* p1 = new int(50); int* p2 = p1; //p2和p1 现在指向同一…

ABP vNext微服务架构详细教程——分布式权限框架(上)

1简介ABP vNext框架本身提供了一套权限框架&#xff0c;其功能非常丰富&#xff0c;具体可参考官方文档&#xff1a;https://docs.abp.io/en/abp/latest/Authorization但是我们使用时会发现&#xff0c;对于正常的单体应用&#xff0c;ABP vNext框架提供的权限系统没有问题&…

前端每隔几秒发送一个请求

2019独角兽企业重金招聘Python工程师标准>>> <html><head><SCRIPT LANGUAGE"JavaScript"> var timer;//声明一个定时器 var count 0; function test() { //每隔500毫秒执行一次add()方法 timer window.setInterval("add()"…

Android之走手机流量让电脑能上网几种方法

1、通过“USB共享网络"来使电脑上网 1)我是vivo手机&#xff0c;把手机插上电脑,打开usb调试&#xff0c;然后正常连接电脑 2&#xff09;在“设置”里面打开“个人热点”里面的“通过usb共享网络”开关 3&#xff09;切换网络连接&#xff0c;对比之前的没插上手机之前没…

element 表单回显验证_关于vue el-form表单报错的问题

在写el-form表单的时候&#xff0c;遇到了蛮多问题&#xff0c;在这里记录一下。1.表单验证报错[Element Warn][Form]model is required for validate to work!初始代码如下&#xff1a;<!-- 表单部分 --> <el-formref"inputForm"size"mini"inlin…

Objective-C NSSetNSMutableSet以及CountedSet

NSSet说实话,对这个类的应用,还不知道到底什么时候会用到,先过一遍脑子吧,以后有需要用到的时候,不至于陌生! #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { autoreleasepool { //创建4个NSNumber对象 NSNumber *obj1 [NSNumber number…