排序算法

【算法】第二章排序

北城以北 提交于 2020-03-09 08:41:38
##目录 初级排序 选择排序 插入排序 希尔排序 归并排序 自顶向下排序 自底向上排序 快速排序 优先队列 ##初级排序 ###一、 选择排序 简述 :选择排序就是遍历一遍数组把最小的和第一个数字交换。第二遍遍历数组时候选择和第二个交换,一次类推。 //注意不要在for循环中用a.length()不然每次都要获取a.length(); public voiv sort(Comparable[] a){ //for(int i=0,i<a.length;i++){ int N = a.length; for(int i=0,i<N;i++){ int min = i; for(int j=i+1;j<N;j++){ //if(a[min]>a[j]){ if(less(a[j],a[min])){ min = j; } //int tmp = a[i]; //a[i] = a[min]; //a[min] = tmp; exch(a,j,min); } } } ###二、 插入排序 简述 :类似于打牌时候边抽牌边整理。第二张开始,就最大的开始对比,然后直到不大时候插入。 public void sort(Comparable[] a){ int N = a.length; //下面是我写的,不知道书上有什么优势。有空测一下。 //for(int i=1;i<N;i++){ // if

大一新生备战2020蓝桥杯

纵然是瞬间 提交于 2020-03-08 18:43:32
一:错误票据 关键字:排序 题目: 资源限制时间限制:1 .0s 内存限制:256.0MB问题描述 某涉密单位下发了某种票据,并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。 你的任务是通过编程,找出断号的ID和重号的ID。 假设断号不可能发生在最大和最小号。 输入格式 要求程序首先输入一个整数N(N<100)表示后面数据行数。 接着读入N行数据。 每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。 每个整数代表一个ID号。 输出格式 要求程序输出1行,含两个整数m n,用空格分隔。 其中,m表示断号ID,n表示重号ID 样例输入1 2 5 6 8 11 9 10 12 9 样例输出1 7 9 样例输入2 6 164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196 172 189 127 107 112 192 103 131 133 169 158 128 102 110 148 139 157 140 195 197 185 152

选择排序-堆排序

依然范特西╮ 提交于 2020-03-08 16:42:12
文章目录 算法简介 Java 实现 时间复杂度 空间复杂度 算法稳定性 算法简介 二叉堆 一棵完全二叉树,对于大顶堆来说,任何一个结点都要大于等于它左右孩子结点,对于小顶堆,任何一个结点都要小于等于它的左右孩子。 二叉堆与数组的联系 二叉堆一般存储在数组中,有这样的性质,如果我们把二叉堆按照从上到下,从左到右的顺序依次存进数组,如果 index 是某个结点的下标值,那么它左右孩子结点的下标值分别是 2*index+1 和 2*index+2 ,不信的筒子们可以尝试写到数组中看看规律。我在数组中怎么知道这个下标的值是右结点还是左结点呢?我们减去 2 除以 2 除得尽就是右结点,否则是左结点,并且其父节点的下标也可以确定了。这个数组保存着这个二叉堆的所有信息 二叉堆的增删 二叉堆的新增和删除,我们会把一个结点新增到最下一层的最后面,然后与父节点比较,进而上浮或者不动;对于删除来讲,假如我们删除某一个中间结点,我们就需要用最尾部结点对删掉的节点位置进行补位,补上之后,再对这个补位的结点和最小(大)的直接子结点比较,进而选择下沉或不动 堆排序 我们利用二叉堆,上浮下沉的性质每次找到最大的结点上浮到顶端,然后我们再保存到最后面,这样就可以从小到大排序了!详细的说堆排序就是先创建大顶堆或小顶堆,然后把这个堆根和最尾部交换位置,将除了尾部的继续构成堆,这样不断循环就可以实现堆排序了 上浮还是下沉

最小生成树算法——kruskal

风流意气都作罢 提交于 2020-03-08 16:38:35
如图,输出最小生成树的生成过程 算法思想: 每个边的权值进行从小到大排序 然后从小到大添加到最小生成树中,若添加一个边后构成环路,则此边不能添加。直到每个顶点都加入到最小生成树中。 需要一个结构体来存储 每个边的权值与始末顶点。再进行排序。 struct { VexType head ; VexType tail ; ArcType lowcost ; } Edge [ MAXSIZE ] ; //存入每条边的首尾以及权值 通过无向图写出邻接矩阵,调用函数创建邻接矩阵 VexType vexs [ 7 ] = { '0' , '1' , '2' , '3' , '4' , '5' , '6' } ; ArcType arcs [ 7 ] [ 7 ] = { { 0 , 17 , MAXNUM , MAXNUM , MAXNUM , 10 , MAXNUM } , { 17 , 0 , 16 , MAXNUM , MAXNUM , MAXNUM , 14 } , { MAXNUM , 16 , 0 , 12 , MAXNUM , MAXNUM , MAXNUM } , { MAXNUM , MAXNUM , 12 , 0 , 19 , MAXNUM , 18 } , { MAXNUM , MAXNUM , MAXNUM , 19 , 0 , 25 , 24 } , { 10 ,

数据结构与算法系列十(排序算法概述)

匆匆过客 提交于 2020-03-08 13:43:47
1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法? 我想好了,还是需要学习数据结构与算法。但是我有两个困惑: 1.如何着手学习呢? 2.有哪些内容要学习呢? 学习方法推荐: #学习方法 1.从基础开始,系统化学习 2.多动手,每一种数据结构与算法,都自己用代码实现出来 3.思路更重要:理解实现思想,不要背代码 4.与日常开发结合,对应应用场景 学习内容推荐: 数据结构与算法内容比较多,我们本着实用原则,学习经典的、常用的数据结构、与常用算法 #学习内容: 1.数据结构的定义 2.算法的定义 3.复杂度分析 4.常用数据结构 数组、链表、栈、队列 散列表、二叉树、堆 跳表、图 5.常用算法 递归、排序、二分查找 搜索、哈希、贪心、分治 动态规划、字符串匹配 2.考考你 在前面两篇,我们详细看了常用算法的第一个主题:递归

Java中的经典算法之冒泡排序

荒凉一梦 提交于 2020-03-08 09:14:02
原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。 第一趟比较完成后,最后一个数一定是数组中最大的一个数,所以第二趟比较的时候最后一个数不参与比较; 第二趟比较完成后,倒数第二个数也一定是数组中第二大的数,所以第三趟比较的时候最后两个数不参与比较; 依次类推,每一趟比较次数-1; …… 举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序:     第一次排序:6和3比较,6大于3,交换位置: 3 6 8 2 9 1     第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1     第三次排序:8和2比较,8大于2,交换位置: 3 6 2 8 9 1     第四次排序:8和9比较,8小于9,不交换位置:3 6 2 8 9 1     第五次排序:9和1比较:9大于1,交换位置: 3 6 2 8 1 9     第一趟总共进行了5次比较, 排序结果: 3 6 2 8 1 9 ------------------------------------------------------

归并排序&&归并排序求逆序对

眉间皱痕 提交于 2020-03-08 08:22:00
归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 算法: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置 第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针超出序列尾 将另一序列剩下的所有元素直接复制到合并序列尾 import java.util.*; public class Main1 { static int a[] = new int[10010]; static int b[] = new int[10010]; public static void sort(int a[], int l, int r) { if (r - l > 0) { int mid = (r + l) / 2; int i = l; int p = l; int q = mid + 1; sort(a, l, mid); sort(a, mid + 1, r); while (p <= mid || q

数据结构——复习九(排序)

微笑、不失礼 提交于 2020-03-08 06:37:30
排序 稳定排序和不稳定排序 假设Ri=Rj(0<=i,j<=n-1,i≠j),且在排序前的序列中Ri领先于Rj(即i<j),若在排序后的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的,否则是不稳定的。 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序 插入排序:直接插入排序、折半插入排序、希尔排序、表插入排序 交换排序:起泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 分配排序 插入排序 直接插入排序 上面的过程很直观,挺简单的,对我来说比较好理解 //我自己写了一种,还有一种都是一样的,后面那种对理解shell排序比较有帮助 void straisort ( int r [ ] , int n ) { int i , j , k ; for ( i = 2 ; i <= n ; i ++ ) { r [ 0 ] = r [ i ] ; j = i - 1 ; for ( k = 1 ; k <= j ; k ++ ) { if ( r [ 0 ] < r [ k ] ) r [ k + 1 ] = r [ k ] ; else { r [ k + 1 ] = r [ 0 ] ; break ; } } } } void straisort ( int r [ ] , int n ) { int i , j ; for (

List对象分组排序算法

霸气de小男生 提交于 2020-03-08 03:00:10
场景:   List里面的对象是订单的节点,比如我们快递的物流状态,这个是需要有序的,所以需要根据订单号进行分组排序。 import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; public class GroupSortTest { public static void main(String[] args) { List<Order> list = new ArrayList<Order>(); Order o1 = new Order("10086","3",(long) 1008603); Order o2 = new Order("10086","2",(long) 1008602); Order o3 = new Order("10086","1",(long) 1008601); Order o4 = new Order("10010","1",(long) 1001001); Order o5 = new Order("10000","3",(long) 1000003); Order o6 = new

C++ Vector 中自定义对象的排序

馋奶兔 提交于 2020-03-08 02:58:00
需求: 客户端收到游戏中的所有联盟列表,现在需要按联盟的属性比如lv来进行排序。 数据存储: 每个联盟数据是一个对象,所有的联盟列表存在一个vector容器里面。 老的解决方法: 冒泡排序方法算法 新的方法: 参考 http://blog.csdn.net/aastoneaa/article/details/8471722 ,总结使用C++自带的std::sort函数。 详细方法: 军团对象,定义了军团的各种简单属性 class AllianceData { public: AllianceData(); ~AllianceData(); std::string uid;//唯一key std::string aname;//名称 nv_uint32 num;//成员总数 nv_uint32 alv;//等级 }; 定义用来比较的函数对象,我们命名为CompHelper.h #ifndef _CompHelper_H_ #define _CompHelper_H_ #include "AllianceData.h" //升序排列 class CompLess { public: bool operator ()(const AllianceData& pstItem1, const AllianceData pstItem2) { return pstItem1.alv <