[作业]排序算法练习(一)

分析:容易想到不用排序,直接用一个数组记录每个数字出现次数即可。

时间:O(N+M),N为数据个数,M为最大数,为了简便直接定为30000;

空间:O(M)

代码:



分析:存数组里,快排。

时间:平均O(Nlg N+K)

空间:O(N)

代码:



分析:根据点到直线距离最短,在最短方案中,所有的连线必是垂直于管道的,即为南北方向。因此给出的x坐标没有作用。

现在,问题转化为:

已知n个数y1,y2,...,yn,求一个数y0,使得 |y1-y0|+|y2-y0|+...+|yn-y0|的值最小。

首先对y数组排序,不妨认为之后y1<=y2<=y3<=...<=yn。

若n为偶数,可将这些数分为n/2组:{y1,yn},{y2,y(n-1)},...,{y(n/2),y(n+1-n/2)};

对{y1,yn},易证当y1<=y0<=yn时,有|y1-y0|+|yn-y0|=yn-y1,若y0在此区域之外,则|y1-y0|+|yn-y0|>yn-y1。

此式对任意一组均成立,最终得出当y(n/2)<=y0<=y(n/2+1)时总和最小。为了程序简便,可以取二者平均数,即原数据的中位数。

若n为奇数,则分出n/2组后,还剩余一个数y(n/2+1),显然令y0=y(n/2+1)即可,仍然是求中位数。

综上,先将y数组排序,然后求中位数,根据要求输出距离之和。

时间复杂度:O(Nlg N)

空间复杂度:O(N)

代码:



分析:N值很大,直接存下来每个人的票数不可能。注意最多只有10000票,所以真正得到票的也不会超过10000人,这样就好办了。

一种方案是离散化(这个词有些高端,不过很简单),把存储的数组做成记录类型,两个域分别是编号和得票数。不过这样的话,每读入一个数,都要花O(M)的时间(或把记录的数组按编号排序,然后二分,这样也不会快多少)找到所在的位置,然后再处理,时间复杂度为O(M2),有可能超时。

另一种方案是把读入的数据排序,这样相同的编号必然在一起。然后可以在O(N)时间内扫描一遍,得到给有编号及他们出现的次数。这里是不用存储的,找到过半的输出,并立刻结束程序(显然不会有两个过半的)。

时间复杂度:O(Mlg M)

空间复杂度:O(M)

代码:

时间: 2024-10-09 07:27:44

[作业]排序算法练习(一)的相关文章

[作业]排序算法练习(二)

下载.预览地址:[作业]排序算法练习(二).pdf 代码打包下载:[作业]排序算法练习(二).rar

C++队列和优先权队列的使用---应用:带时限作业排序

C++队列和优先权队列的使用-应用:带时限作业排序 C++队列的使用 首先包含头文件 include 队列可以用线性表(list)或双向队列(deque)来实现(注意vector container 不能用来实现queue,因为vector 没有成员函数pop_front!): queue<list<int>> q1; queue<deque<int>> q2; 其成员函数有"判空(empty)" ."尺寸(Size)"

算法学习第一幕:排序算法1

排序算法应该是大学毕业后用到频率较高的为数不多的几个算法之一,通常情况下根据原理不同分为几个不同的类别,对我个人来说,主要的类别: 1,随意写随意用无视效率的冒泡,插入,选择三种基本排序 2,最常用的效率相对前三种较好的快速排序,快排 3,神特么除了多年写作业刷题库没有遇到过实际应用场景的堆排.归并排序 冒泡排序 首先我们介绍的是冒泡排序,这个应该是接触排序时学会的第一种排序方式,早在久远的初中普及VB时代就用过冒泡排序,其根本原理是每次比较相近的两处,如果二者顺序与要求的排序顺序相反则交换二者

十种常见的排序算法,面试算法必考

1.冒泡排序 已知一组无序数据a[1].a[2].……a[n],需将其按升序排列.首先比较a[1]与a[2]的值,若a[1]大于a[2]则交换两者的值,否则不变.再比较a[2]与a[3]的值,若a[2]大于a[3]则交换两者的值,否则不变.再比较a[3]与a[4],以此类推,最后比较a[n-1]与a[n]的值.这样处理一轮后,a[n]的值一定是这组数据中最大的.再对a[1]~a[n-1]以相同方法处理一轮,则a[n-1]的值一定是a[1]~a[n-1]中最大的.再对a[1]~a[n-2]以相同方

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

排序算法比较及其应用

一.将各种数据排序 只要实现了Comparable接口的数据类型就可以被排序. 但要使算法能够灵活地用不同字段进行排序,则是后续需要考虑的问题. 1.指针排序 在Java中,指针操作是隐式的,排序算法操作的总是数据引用,而不是数据本身. 2.键不可变 如果在排序后,用例还可以改变键值,那么数组很可能就不是有序的了.类似,优先队列也会乱套. Java中,可以用不可变数据类型作为键来避免这个问题,如String,Integer,Double和File都是不可变的. 3.廉价交换 使用引用的另一个好处

选择排序 —— 排序算法系列

假设我们有如下一个数组: 使用选择排序算法对这个数组进行排序,步骤如下: 第 1 次 在下标0到6之间找到最小的数字,我们可以发现最小的数字是15,它在下标为4的位置上: 把下标4上面的数字跟下标0上面的数字互换,得到排序如下图的数组: 第 2 次 在下标1到6之间找到最小的数字,我们可以发现最小的数字是33,它在下标为5的位置上: 把下标5上面的数字跟下标1上面的数字互换,得到排序如下图的数组: 第 3 次 在下标2到6之间找到最小的数字,我们可以发现最小的数字是48,它在下标为5的位置上:

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

排序算法总结

各种排序算法总结  排序算法  插入排序 冒泡排序  选择排序  归并排序  快速排序 堆排序  计数排序  基数排序  桶排序  思想  构建有序序列 两两交换 每次找一个最小值 分治法思想 分治法思想 最小堆.最大堆 数字本身的属性  对数据选择多种基数  函数的映射关系.Hash  数据结构  数组  数组  数组  数组 不定   数组 数组 数组  数组  最差时间复杂度 O(n^2)   O(n^2)   O(n^2)   O(n*lgn)  O(n^2).改进O(n*lgn)  O