zoukankan      html  css  js  c++  java
  • C语言II博客作业02

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/CST2020-2
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2020-2/homework/11810
    这个作业的目标 <掌握用一维数组进行编程,掌握选择排序法和二分查找法>
    学号 20209000

    2.1 完成PTA作业,并给出编程题完成截图(5分)


    2.2 题目:快速寻找满足条件的两个数

    能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。
    解法一:采用穷举法,从数组中任意取出两个数字,计算两者之和是否为给定的数字。
    解法二:对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中。
    解法三:对数组进行排序,然后使用二分查找法针对arr[i]查找Sum-arr[i]。
    要求:
    1.根据三种解法给出相应的代码,并给出测试数据。(15分)
    2.请说明三种算法的区别是什么?你还可以给出更好的算法吗?(10分)

    方法一


    方法二


    方法三



    2.请说明三种算法的区别是什么?你还可以给出更好的算法吗?(10分)
    穷举法思路简单,不用太多技巧,但是效率不高:第二个就是假设给定的和为Sum。一个变通的思路,就是对数组中的每个数字arr[i]都判别Sum-arr[i]是否在数组中,这样,就变通成为一个查找的算法:
    二分法可以排除多余的选项,效率较高。暂时想不出更好的方法。
    2.3 请搜索有哪些排序算法,并用自己的理解对集中排序算法分别进行描述(5分)
    冒泡排序:它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
    选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
    插入排序:需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
    希尔排序: 将一个已排序的数列插入到另一个已排序的数列中。
    归并排序:先使每个子序列有序,再使子序列段之间有序。
    快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
    堆排序:指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
    计数排序:计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。
    桶排序:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序。
    基数排序:按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集。
    2.4 请给出本周学习总结(15分)
    1 学习进度条(5分)

    2 累积代码行和博客字数(5分)

    3 学习内容总结和感悟(5分)

    1总的来说自己的学习情况还不错,但仍需努力,对知识的渴求度不高。
    2没有养成对自己不会的知识加以研究,以后要注意。
    3要学会不懂就问,不要担心其他的,只要张口问,你肯定会有收获。

    冒号排序法:
    冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。

    冒泡排序流程:
    至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
    由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
    用二重循环实现,外循环变量设为i,内循环变量设为j。假如有10个数需要进行排序,则外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每一个i,j的值依次为1,2,...10-i。

    ···
    void bubble_sort(int* x, int n)

    {

    int j, k, h, t;
    
    for (h = n - 1, h = k; h > 0; h--) /*循环到没有比较范围*/
    
    {
    
    	for (j = 0, k = 0; j < h; j++) /*每次预置k=0,循环扫描后更新k*/
    
    	{
    
    		if (*(x + j) > * (x + j + 1)) /*大的放在后面,小的放到前面*/
    
    		{
    
    			t = *(x + j);
    
    				*(x + j) = *(x + j + 1);
    
    			*(x + j + 1) = t; /*完成交换*/
    
    			k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/
    
    		}
    
    	}
    
    }
    

    }···

  • 相关阅读:
    shell
    regionMatches方法
    ==
    使用INTO子句创建新表
    数据库除运算
    数据库笛卡尔积运算
    人生格言
    刚开通~
    Nginx:413 Request Entity Too Large
    ORACLE 查看并修改最大连接数
  • 原文地址:https://www.cnblogs.com/nihaoshijie/p/14526265.html
Copyright © 2011-2022 走看看