排序
Jaster_wisdom
程序员
展开
-
经典排序之归并排序
归并排序时间复杂度为O(nlgn)归并算法采取分治策略,直观上其操作如下:1.分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列2.解决:使用归并排序递归地排序两个子序列3.合并:合并两个已排序的子序列以产生已排序的答案#include using namespace std;#define MAX 10000void merge(int A[],原创 2016-04-26 23:23:27 · 556 阅读 · 0 评论 -
LeetCode56. 合并区间
题目大意:合并给定的一些区间,使得它们各个区间之间没有重叠。题目分析:首先,对给定的区间,按照左边的临界值进行从小到大排序,然后维持一个[left,right]区间。首先,将第一个区间赋给[left,right],然后看第二个区间[x,y],若x<=right,那么合并后的区间应该是[left,max(right,y)], 同时更新[left,right]区间;若x>right,此时就...原创 2018-07-03 18:38:08 · 1093 阅读 · 0 评论 -
leetcode4. Median of Two Sorted Arrays(求两个排序数组的中位数)
题目大意:已知两个排好序的数组nums1和nums2,长度分别为m和n,要求的是合并nums1和nums2之后的所有数的中位数。时间复杂度要求O(log(m+n))题目分析:容易想到的是归并排序算法,用两个指针分别指向nums1和nums2,分别比较两个指针所指向的元素的大小,哪个小,哪个就往后移,直到两个指针都指向了数组的末尾。AC代码展示:class Solution {public: ...原创 2018-04-10 20:24:30 · 334 阅读 · 1 评论 -
九度OJ 1107 搬水果
题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。当然经过 n‐1 次合并之后,就变成一堆了。小明在合并水果时总共消耗的体力等于每次合并所耗体力之和。 假定每个水果重量都为 1,并且已知水果的种类数和每种水果的数目,你的任务是设原创 2016-08-07 16:29:24 · 756 阅读 · 0 评论 -
华为OJ 字符串排序
描述编写一个程序,将输入字符串中的字符按如下规则排序。规则1:英文字母从A到Z排列,不区分大小写。 如,输入:Type 输出:epTy规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列。 如,输入:BabA 输出:aABb规则3:非英文字母的其它字符保持原来的位置。 如,输入:By?e 输出:Be?y样例: 输入: A Famous Saying:原创 2016-07-31 22:57:53 · 1127 阅读 · 0 评论 -
九度OJ 1061 成绩排序
题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。输入: 测试数据有多组,每组输入第一行有一个整数N(N 每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。输出:原创 2016-07-16 22:06:44 · 860 阅读 · 0 评论 -
九度OJ 1007 奥运排序问题
题目描述:按要求,给国家进行排名。输入:有多组数据。第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。接下来一行给出M个国家号。输出:排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 对每个国家给出最佳排名排名方式 和 最终排名格式为: 排名:排原创 2016-07-14 21:07:01 · 1558 阅读 · 0 评论 -
九度OJ 1023
题目描述: Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。 对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号原创 2016-07-01 08:58:40 · 1690 阅读 · 0 评论 -
九度OJ 1041 简单排序
题目描述:You are given an unsorted array of integer numbers. Your task is to sort this array and kill possible duplicated elements occurring in it.输入:For each case, the first line of the inp原创 2016-07-09 19:24:51 · 778 阅读 · 0 评论 -
优先队列 priority_queue
优先队列本质上还是属于队列的范畴,只不过多了一项功能,根据用户自定义的数据进行任意规则的动态排序。它的模板声明包括三个参数,priority_queue(Type,Container,Functional)第一个是数据类型,可以是整型、结构体类型、类类型等等,第二个参数是容器,一般是vector或者deque,第三个是比较函数,默认缺省的是vector,operator 下面的程序分别原创 2016-05-20 09:19:43 · 614 阅读 · 0 评论 -
计数排序
前几篇博客排序算法都是 用的比较排序,时间复杂度最低的是 O(nlgn),这也是比较排序最优的时间复杂度。这次计数排序用的是线性时间复杂度的排序,也就是说不是通过比较来确定排序顺序的。计数排序是 假设n个元素中的每一个都是在0到k区间内的一个整数,也就是整个数组里最大的数是 k,这是我们需要一个数组B[]来存放排序的输出,用C[]来提供临时存储的空间。其中,特别有意思的是,C[i],它保存原创 2016-05-08 17:43:07 · 1076 阅读 · 0 评论 -
九度OJ 1202
题目意思是,输入n,表示n个数,然后输入这n个数,最后输出这从小到大的n个数。这道排序题因为数量规模在1~100之间,所以几乎用所有的排序算法都不会超时,我这里用的是这样的方法,类似冒泡排序。首先第一轮循环,将每一个数字与后面的数字进行比较,如果它的值比后面的值要大,则进行交换。否则顺序保持不变。这样在O(n^2)的数量级上就可求解出来。这样一道简单的排序题,我还是wrong了两次,主原创 2016-05-31 15:38:51 · 775 阅读 · 0 评论 -
堆排序
堆排序算法时间复杂度为 O(nlgn)堆从结构上讲,应该是一棵完全二叉树。在堆排序中一个很重要的概念是,维持最大堆的特性。最大堆就是每个节点的值比它左右孩子节点都要大。我们首先将非叶子节点 都维持最大堆的特性一次。就是说保证非叶子节点它的左右孩子都比它的值要小。build_max_heap函数实现其中,一个很重要的函数是max_heapify,它的功能是控制单个节点,保证它的孩子节点小原创 2016-05-06 22:55:11 · 1792 阅读 · 0 评论 -
快速排序
在大一下 上数据结构的时候,快速排序这节听得是云里雾里,代码实现压根不知道从哪里入手。不过,今天看《算法导论》,耐着性子看完觉得不是很难。不过,要证明它的最坏时间复杂度为O(n*2),平均时间期望复杂度为O(n*lgn),应该来说,快速排序是实际排序应用中最好的选择。快速排序的大体思想是这样的:首先,从未排序的数组中放置一个中间元素,使得该元素左边的值都小于等于它,而该元素右边的值都大于它原创 2016-05-07 15:59:40 · 910 阅读 · 0 评论 -
经典排序之选择排序
选择排序基本思想:选择排序算法采用的方法比较直观:通过在待排序子表中完整地比较一遍以确定最大(小)元素,并将元素放在子表的最前(后)面。 时间复杂度: O(n*2) 稳定性分析:该算法是不稳定排序,因为关键字相同的元素在排序过程中可能会交换次序。例如,对数据表(3,3,2)排序时,由于要将第一个3与2交换而导致两个3之间的换位。#include using n原创 2016-05-24 18:57:42 · 569 阅读 · 0 评论 -
经典排序之希尔排序
希尔排序基本思想:将待排序的序列分为若干组,在每组内进行直接插入排序,以使整个序列基本有序,然后再对整个序列进行直接插入排序。该方法实质上是一种分组插入方法。具体来说,先取一个小于n的整数d1作为增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。现在各组内进行直接插入排序;然后,取第二个增量d2 一般的初次取序列的一半为增量,以后每次减半,直到增量为1.原创 2016-05-24 18:22:38 · 2296 阅读 · 0 评论 -
经典排序之插入排序
插入排序的思路可以这样形象地理解:整理手中的扑克牌,每抓到一张牌,比较它与之前手中的牌的大小,插在合理的位置。对于少量元素的排序,它是一个有效的算法。它的时间复杂度为 O(n^2)#include using namespace std;int main(){ //插入排序 int a[] = {5,2,4,6,1,3}; int i,j,key; i原创 2016-04-25 22:15:12 · 662 阅读 · 0 评论 -
经典排序算法之冒泡排序
冒泡排序基本思想:从一端开始,逐个比较相邻的两个元素,发现倒序则交换。典型的做法是从后往前,或从下往上逐个比较相邻的元素,发现倒序就进行交换。一轮比较之后,一定可以将最大的元素交换到其最终位置上。 时间复杂度:O(n*2) 稳定性分析:稳定的排序算法这里说明一下,何为排序算法的稳定性?排序算法的稳定性就是假定在待排序的记录序列中,存在多个具有相同的关键字原创 2016-05-24 16:20:04 · 812 阅读 · 0 评论 -
LeetCode215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。方法一:排序后求解...原创 2018-08-20 18:50:32 · 1013 阅读 · 0 评论