[算法天天练]插入排序算法

#include<stdio.h>voidshow(intarr[],intlength){for(inti=0;i<length;i++){printf("%d",arr[i]);}printf("");}voids_insert(intarr[],intlength){if(length<0)return;for(inti=1;i<length;i++){intk=i;for(intj=0;j<i;j++){if(arr[j]<arr[k]){intt=arr[j];arr[j]=arr[k];arr[k]=t;}}}}intmain(){intarr[10]={2,1,5,4,3,9,8,7,6,0};s_insert(arr,10);show(arr,10);return0;}  ...

[1]输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。     10    /      6  14   /  /    4 812 16转换成双向链表4=6=8=10=12=14=16 解:二元查找树:它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根节点的值;(3)左、右子树也分别为二元查找树 /***1:构造二叉查找树;*2:中序遍历二叉查找树,因此结点按从小到大顺序访问,*假设之前访问过的结点已经调整为一个双向链表,那么*只需要将当前结点连接至双向链表的最后一个结点即可,*访问完后,双向链表...

[算法天天练] 归并排序

要实现归并排序递归方法:第一步:先将原来的数据表分成排好序的子表,然后调用合并函数对子表进行归并,使之成为有序表例如有如下向量:⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾25,10,7,19,3,48,12,17,56,30,21/25,10,7,19,348,12,17,56,30,21//25,107,19,348,12,1756,30,21////2510719,3............ 归并算法划分子表和归并子表与原数据序列次序无关,因此算法最坏情况,最坏情况和平均情况时间复杂度是一样的,时间复杂度为O(NlogN),空间复杂度O(N+logN)#include<stdio.h>#include<stdlib.h>voidMerge(intarr[],intbeg,intmid,intend){inti=beg;intj=mid+1;intp=0;int*ipa;ipa=(int*)malloc((end-beg+1)*sizeof(int));if(!ipa)return;while(i<=mid&&j<=end){//ipa[p+...

[算法天天练]快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,作为面试题来考试。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。以一个数组作为示例,取区间第一个数为基准数。01234567897265788604283734885初始时,i=0; j=9;  X=a[i]=72由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8];i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3];j--; #include<stdio.h>voidQuickSo...

【转帖】常见的排序算法

 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序、分配排序和计数排序。插入排序主要包括直接插入排序,折半插入排序和希尔排序两种;选择排序主要包括直接选择排序和堆排序;交换排序主要包括冒泡排序快速排序;归并排序主要包括二路归并(常用的归并排序)和自然归并。分配排序主要包括箱排序和基数排序。计数排序就一种。稳定排序:假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。其中冒泡,插入,基数,归并属于稳定排序;选择,快速,希尔,堆属于不稳定排序。 下面是对这些常见排序算法的介绍。未来测试代码的正确性,我们采取了随机生成10个序列,然后先使用C++STL中给出的排序算法sort来得到一个正确的排序,然后再使用我们的方...

[算法天天练]桶排序

【问题】:如果有一组数据a[]={0,9,2,3,4,5,3,5,2,8},对它进行从小到大的顺序排列 #include<stdio.h>voidBucketSort(){inti,j;inta[]={0,9,2,3,4,5,3,5,2,8};intb[10]={0};intiaSize=sizeof(a)/sizeof(int);intibSize=sizeof(b)/sizeof(int);for(i=0;i<iaSize;i++){b[a[i]]++;}for(i=0;i<iaSize;i++){for(j=0;j<b[i];j++){printf("%d",i);}}printf("");}intmain(){BucketSort();}  说一下复杂度的问题,桶排的复杂度O(m+n),其中m表示桶的个数,n表示待排序数的个数,即表示为O(M+N)....
IT猿 IT猿·2020-03-27

汇编:3个数排序(从大到小)

;三个数排序(从大到小)DATASSEGMENTarraydb12,250,123DATASendsCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:movAX,DATASmovDS,AXmovsi,offsetarraymoval,[si]movbl,[si+1]movcl,[si+2]cmpal,bljaeflag1;大于等于跳转xchgal,bl;交换flag1:cmpal,cljaeflag2;大于等于跳转xchgal,cl;交换flag2:cmpbl,cljaeflag3xchgbl,cl;交换flag3:;重新放入缓冲区mov[si],almov[si+1],blmov[si+2],clmovah,4chint21HCODESendsendSTART ...
IT猿 IT猿·2020-03-27

mysql将字符串字段转为数字排序或比大小

  SELECT*FROMStudentWHERE1=1ORDERBY-IDDESC;SELECT*FROMStudentWHERE1=1ORDERBY(ID+1);   2017年09月17日01:36:31 阅读数:6566 版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/superit401/article/details/78007969mysql里面有个坑就是,有时按照某个字段的大小排序(或是比大小)发现排序有点错乱。后来才发现,是我们想当然地把对字符串字段当成数字并按照其大小排序(或是比大小),结果肯定不会是你想要的结果。这时候需要把字符串转成数字再排序。最简单的办法就是在字段后面加上+0如把'123'转成数字123(以下例子全为亲测):排序:例:方法一:ORDERBY'123'+0;(首推)方法二:ORDERBY CAST('123'ASSIGNED);方法三:ORDERBY CONVERT('123',SIGNED);比大小:例:SE...

cassandra高级操作之索引、排序以及分页

  本次就给大家讲讲cassandra的高级操作:索引、排序和分页;处于性能的考虑,cassandra对这些支持都比较简单,所以我们不能希望cassandra完全适用于我们的逻辑,而是应该将我们的逻辑设计的更适合于cassandra  路漫漫其修远兮,吾将上下而求索!  github:https://github.com/youzhibing  码云(gitee):https://gitee.com/youzhibing  Cassandra对查询的支持很弱,只支持主键列及索引列的查询,而且主键列还有各种限制,不过查询弱归弱,但它还是支持索引和排序的。  cassandra的查询约束    第一主键只能用=号查询    第二主键支持=><>=<=    索引列只支持=号   索引查询    Cassandra支持创建二级索引,可以创建在除了第一主键(分区键:partitionkey)之外所有的列上;不同的cassandra版本对集合列的索引的支持也是不同的,有的支持有的不支持,大家可以去看下官方文档的Changes,2.1版本开始,可以建立集合索引  ...

排序之归并排序

  路漫漫其修远兮,吾将上下而求索!  github:https://github.com/youzhibing  码云(gitee):https://gitee.com/youzhibing  “归并”一词的中文含义就是合并、并入的意思,而在数据结构中的定义是将两个或两个以上的有序表组合成一个新的有序表。既然是归并、并入,那么必然就有子序列了,子序列从何而来,当然是目标序列拆分而来啦!就是先拆分,在合并。     归并排序(MergingSort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到⌈n/2⌉(⌈x⌉表示不小于x的最小整数)个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。  其过程如图所示publicvoidmergeSort(int[]arr){mSort(a...
IT猿 IT猿·2020-03-27

排序之快速排序(下)

  路漫漫其修远兮,吾将上下而求索!  github:https://github.com/youzhibing  码云(gitee):https://gitee.com/youzhibing  快排上是可以进行优化的,那么可以进行哪些优化了,是不是和你想的一样了?我们往下看  如果我们选取的pivotKey是处于整个序列的中间位置,那么我们可以将整个序列分成小数集合和大数集合了。但注意,我刚才说的是“如果……是中间”,那么假如我们选取的pivotkey不是中间数如何呢?比如我们用到的数组{9,1,5,8,3,7,4,6,2},由代码“pivotkey=arr[low];”知道,我们应该选取9作为第一个枢轴pivotKey。此时,经过一轮“pivot=partition(arr,1,9);”转换后,它只是更换了9与2的位置,并且返回9给pivot,整个系列并没有实质性的变化。  就是说,代码“pivotkey=arr[low];”变成了一个潜在的性能瓶颈。排序速度...
IT猿 IT猿·2020-03-27

排序快速排序(上)

  本篇博客是在伍迷兄的博客基础上进行的,其博客地址。  希尔排序相当于直接插入排序的优化,它们同属于插入排序类,堆排序相当于简单选择排序的优化,它们同属于选择排序类。而快速排序其实就是冒泡排序的升级,它们都属于交换排序类。即它也是通过不断的比较和移动交换来实现排序的,只不过它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动交换次数,而不是像冒泡排序那样左右两两进行比较和交换。  说白了,其实就是在冒泡排序的基础上加入了记忆的功能,类似堆排序于简单选择排序,冒泡排序两两左右比较之后是没有记住两者大小关系的,下轮比较的时候两者比较还是如他们第一次比较一样,彼此不认识;而快速排序,他选取了一个枢纽值,使得枢纽值左右两边的元素有个大小关系,那么枢纽值左边的就不需要与枢纽值右边的进行比较了。  通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的;就是选择一个关键字,通过一趟排序(进行比较和移动)使得...
IT猿 IT猿·2020-03-27

排序之堆排序

  本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助。  今天,骚年找到博主,叹了一声:“唉”,博主到:“年纪轻轻的,唉什么?”,骚年说:“博主,我看了你的简单选择排序,自己也去实现了,发现确实好理解,但是,我却发现它做了好多多余的事,连鱼都不如”,博主顿时懵了,道:“连鱼都不如是什么意思?”,骚年到:“鱼都有7秒的记忆,简单选择排序却记忆都没有,比过之后还是不知道彼此之间的大小关系,下次还得重新比较,你看如下  当i=0    3和7有个比较过程,结尾当5和1交换之后  当i=1时,    3和7又有一个比较过程,那么之前的那次比较就根本没有记录下来,如果记录下来了,那么这次就不用比较了”。  博主:“恩,你说的有道理,那你有什么办法让他有记忆吗?&rd...
IT猿 IT猿·2020-03-27

排序之简单选择排序

  本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助。  选择排序的基本思想是每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录。我们这里先介绍的是简单选择排序法。简单选择排序法(SimpleSelectionSort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换之,就是说一刚开始,从序列arr[0...n-1]选出最小的元素与第1个记录即arr[0]交换,再从arr[1...n-1]中选出最小的与arr[1]进行交换,arr[2...n-1]中最小的与arr[2]进行交换,以此类推,直至整个序列有序。  /***简单选择排序*@paramarr*/publicstaticvoidsimpleSelectSort(int[]arr){intlen=arr...
IT猿 IT猿·2020-03-27

排序之希尔排序(shell sort)

  本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助。  骚年在上次与博主进行了直接插入排序的讨论后,找到了博主,说:“博主,对于直接插入排序,我有重大的发现”,博主想了想,就问:“什么发现?”,骚年:“我发现了如下两点”    1)当序列的个数比较少时,直接插入排序效率高;这个好理解,个数比较少,那么插入的次数也就少了,博主就说:“恩,这个发现不难,却也需要细心”。    2)如果序列本身就是基本有序,那么直接插入排序效率高;博主:“嗯?”,骚年解释道:“你看直接插入排序的核心代码:”           for(inti=1;i<len;i++){for(intj=i-1;j>=0&&arr[j]>...
首页上一页...5758596061下一页尾页