排序算法

原地归并算法

独自空忆成欢 提交于 2020-04-04 05:16:15
归并排序算法(mergesort)是将一个序列划分为同样大小的两个子序列,然后对两个子序列分别进行排序,最后进行合并操作,将两个子序列合成有序的序列.在合成的过程中,一般的实现都需要开辟一块与原序列大小相同的空间,以进行合并操作。这儿有比较全的排序算法: http://www.cnblogs.com/xkfz007/archive/2012/07/01/2572017.html 之前使用过的归并排序,都是需要重新开辟新空间的。一般需要开辟的空间为n(数组大小),所以空间复杂度是O(n). 其实可以对于归并可以不需要开辟新的空间就可以直接进行归并的方法,即原地归并。 其主要思想就是,因为需要归并的部分是有序的,所以需要找到两个序列中第二个序列小于第一个序列的部分,比如对序列[<1, 3, 5, 7>, <2, 4, 6, 8>]进行归并操作。2就是第二个序列中小于第一个序列中的<3,5,7>部分,需要调节<3,5,7>,与2的位置。然后不断的进行扫描。其中进行调整的时候,用到的是对序列的循环移动,循环左移或循环右移。这样就不需要新的空间了。 C++代码如下: void rotate_right(int *v,int sz,int n){ reverse(v,v+sz); reverse(v,v+n); reverse(v+n,v+sz); } void merge(int *v

专题训练之拓步排序

↘锁芯ラ 提交于 2020-04-04 04:26:05
推荐几个博客:https://blog.csdn.net/dm_vincent/article/details/7714519 拓扑排序的原理及其实现 https://blog.csdn.net/u012860063/article/details/38017661 拓扑排序的几种写法 https://blog.csdn.net/shahdza/article/details/7779389 拓扑排序题集 1.基于DFS的拓扑排序:一般适用于数据较小并且需要判断有无环的情况 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=150; 6 int n,vis[maxn],topo[maxn],cnt; 7 bool g[maxn][maxn],flag; 8 9 void dfs(int u) 10 { 11 if ( vis[u]<0 ) { 12 flag=false; 13 return; 14 } 15 if ( vis[u]>0 ) return; 16 else vis[u]=-1; //表示当前还在访问中 17 for ( int v=1;flag&&v<=n;v++ ) { 18 if ( g[u][v] ) dfs

转:netflix推荐系统竞赛

﹥>﹥吖頭↗ 提交于 2020-04-03 22:44:39
原文链接: Netflix recommendations: beyond the 5 stars (Part 1) , (Part 2) 原文作者: Xavier Amatriain and Justin Basilico 翻译: 大魁 前言 Nexflix是一家提供在线视频流媒体服务和DVD租赁业务的公司,也是著名的Netflix大奖赛的发起者。如果读者希望进一步了解Netflix,建议读一下和讯上的一篇文章: Netflix:从传统DVD租赁向流媒体华丽转身 以及爱范儿上的: Netflix成功的背后:高薪,高标准,高淘汰率,股票,无限制休假,恐惧文化,垃圾便当午餐 在这篇博文中,作者为我们掀开了Netflix最有价值的资产--推荐系统的面纱。 全文分两部分。在第一部分中,作者首先介绍了Netflix Prize对智能推荐领域的贡献,Netflix推荐服务的主要模块,以及推荐服务如何满足网站的商业需求;第二部分中,作者描述了系统使用的数据和模型,讨论了如何将离线的机器学习实验与线上的AB testing相结合。 第一部分 Netflix大奖赛与推荐系统 在2006年,我们启动了Netflix大奖赛,是一个机器学习和数据挖掘的比赛,旨在解决电影评分预测问题。我们举办这个比赛的目的是为了发现更好的方法来向我们的用户推荐产品,这是我们商业模式的核心任务

排序算法之选择排序

旧城冷巷雨未停 提交于 2020-04-03 22:08:31
一、选择排序原理   将未排序序列中的第一个元素标记为最小,存放到有序区的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 关键点: 无序区 记录最小元素的位置 二、实现 def select_sort(li): for i in range(len(li)-1): #循环趟数 min_position=i #将无序区的最小位置进行保存 for j in range(i+1,len(li)): #再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾 if li[j]<li[min_position]: min_position=j li[min_position],li[i]=li[i],li[min_position] l=[3,5,2,9] select_sort(l) print(l) #[2, 3, 5, 9] 原文: https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/2.selectionSort.md 来源: https://www.cnblogs.com/shenjianping/p/11068508.html

常见排序方法

不问归期 提交于 2020-04-03 14:55:14
比较常用的排序方法(升序): 冒泡排序: 最常用的排序方法。大体思路就是每次选出一个最大值,第二次选出次大值,基本上就是两个for循环。 鸡尾酒排序 :冒泡排序方法的变种,鸡尾酒排序,待排序数组首先从0->n-1找出最大值,然后n-2->0找出最小值,然后再从1->n-2找次大值……依次类推……一个while循环,里面套两个for循环即可。 奇偶排序 :也是冒泡排序的变种。一个while循环,里面两个for循环,但是一个for循环从0开始,一个从1开始,每次加2,比较相邻两个数值大小。 快速排序 :是分之思想的一种体现。对于一个待排序队列,首先选择一个 基准 ,扫描数据,大于这个基准数据的元素放在右侧,小于的放在左侧,然后左侧和右侧的数据又是待排序队列,再分别选择基准……递归下去,知道全部都是有序的。 插入排序: 是一种比较直观的排序方法,从待排序队列中构建有序队列,把剩余的待排序数据插入到有序队列中。 希尔排序 :分步长排序法,对相隔步长的数据分别进行排序,然后减小步长,直至步长为1,主要可以减少数据的移动次数。 选择排序: 选择一个最大元素放入队尾,然后从剩余的元素中选择最大的放入队尾的前一位置,直到待排序数组中只有一个元素为止。 堆排序算法 :选择排序的一种,不停的构建大(小)顶堆,然后取出顶,得到有序序列。 归并排序 :也是典型的分治法思想的应用

C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

余生长醉 提交于 2020-04-02 08:24:38
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇。 主要针对线性表中的 链表 STL std::list进行分析和总结 。 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表、二叉树、图等。在使用这些数据结构时感到有些吃力,主要是对一些主要的数据结构理解的不够,所以趁着暑假假期,近期一段时间总会抽出时间复习一下数据结构, 參考的教材是王立柱编著的《C/C++与数据结构》 ,在详细的应用中採用的是C++标准模板库STL中相应实现的数据结构,主要 參考的是MSDN文档 。 跟着教材的一步一步推进。如今已经复习完了链表一章节。详细的理论能够參看我的博文: http://blog.csdn.net/lg1259156776/article/details/47018813 本次关注点在list模板类的使用。 正文 回想动态数组类 上一篇总结STL vector动态数组类的时候忘记了对还有一种跟vector很类似的动态数组类deque进行说明。 以下对此进行一下补充。 STL deque类须要包括<deque>和使用std。支持在数组的开头和末尾插入或删除元素,而vector仅仅能在末尾插入或删除

STL--set使用用法

我们两清 提交于 2020-04-01 05:22:03
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器。( 相同的值不存,存进去自动排序好了 ) set/multiset会根据待定的排序准则,自动将元素排序 。两者不同在于 前者不允许元素重复(重复元素只操作一遍,其他的忽略处理), 而后者允许。(因为插入的时候,它们分别调用的是insert和unique_insert) 同理,map和multimap也是这个意思。set、map它们的 底层都是基于红黑树 。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。 平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。 set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容器set成员函数:clear()--清除所有元素 c++ stl容器set成员函数:count()--返回某个值元素的个数 c++ stl容器set成员函数:empty()--如果集合为空

java -排序算法

六月ゝ 毕业季﹏ 提交于 2020-03-31 23:51:46
java -排序算法记录 import java.util.Arrays; public class SomeSort {   public static void main(String[] args) {     // TODO Auto-generated method stub     int[] a = { 1, 5, 6, 2, 7, 4, 9 };// 升序     // selectionSort(a);     //bubbleSort(a);     insertSort(a);     System.out.println(Arrays.toString(a));    }   // 选择排序   public static void selectionSort(int[] a) {     for (int i = 0; i < a.length; i++) {       int min = a[i], temp;       for (int j = i; j < a.length; j++) {         if (min > a[j]) {           temp = min;           min = a[j];           a[j] = temp;         }       }       a[i] = min;  

递归归并排序 二路归并排序

五迷三道 提交于 2020-03-31 15:34:53
归并算法的两种方法: 1、使用分治法的递归归并算法: /*递归归并排序 *将有二个有序数列list[first...mid]和list[mid+1,...last]合并 *list:待排序数组 *first:子序列1的下界 *mid:子序列1的上界 *last:子序列2的上界 *temp:临时保存数组 */ void Merge(element list[], int first, int mid, int last, element temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (list[i] < list[j]) temp[k++] = list[i++]; else temp[k++] = list[j++]; } while (i <= m) temp[k++] = list[i++]; while (j <= n) temp[k++] = list[j++]; for (i = 0; i < k; i++) list[first + i] = temp[i]; return ; } /*递归归并排序 *分治,完成递归归并 *list:待排序数组 *first:list下界 *last:list上界 *temp

Comparable && Comparator

核能气质少年 提交于 2020-03-30 05:56:22
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。下面通过两个例子分别用Comparable和Comparator实现对User对象中年龄排序。 1.通过实现Comparable接口,根据User的年龄进行排序。 2. 通过实现Comparator接口,根据User的年龄进行排序。 选择Comparable接口还是Comparator? Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用: 1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身 2、可以使用多种排序标准,比如升序、降序等。 来源: https://www.cnblogs.com/xiaowater/p/9554472.html