排序算法

7种常见的排序算法

怎甘沉沦 提交于 2020-11-28 06:49:51
package test.arithmetic; public class SortMethod { public static void printArray(int[] array) { System.out.print("{"); for (int i = 0; i < array.length; i++) { System.out.print(array[i]); if (i < array.length - 1) { System.out.print(", "); } } System.out.println("}"); } /** * 1.冒泡排序 * 优点:稳定,比较次数已知; * 缺点:慢,每次只能移动相邻两个数据,移动数据的次数多。 * 初始关键字 [49 38 65 97 76 13 27 49] * 第一趟排序后 [38 49 65 76 13 27 49] 97 * 第二趟排序后 [38 49 65 13 27 49] 76 97 * 第三趟排序后 [38 49 13 27 49] 65 76 97 * 第四趟排序后 [38 13 27 49] 49 65 76 97 * 第五趟排序后 [38 13 27] 49 49 65 76 97 * 第六趟排序后 [13 27]38 49 49 65 76 97 * 第七趟排序后 [13] 27 38 49 49

常用算法(冒泡、插入、选择、快速)和二叉树详解

浪子不回头ぞ 提交于 2020-04-08 13:59:31
  同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。   计算机科学中,算法的 时间复杂度 是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号(Order)表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。 定义   在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。 算法复杂度   算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。 时间复杂度   1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。   2.

选择排序--C++

a 夏天 提交于 2020-04-08 10:56:46
/*A[1...n]为一个有n个元素的数组,首先找到最小元素,将其存放在A[1]中, 然后找到剩下的n-1个元素中的最小元素,将其存放在A[2]中,重复此过程直至找到第二大元素*/ /*算法描述: 输入: n个元素的数组A[1...n] 输出:按非降序排列的数组A[1...n] for i <- 1 to n-1 k <- i for j <- i+1 to n {查找第i小的元素} if A[j] < A[k] then k <- j end for if k != i then 交换A[i]与A[k] end for */ #include<iostream> #define N 9 using namespace std; void selectSort(int A[], int n) { int k; int temp; //k表示每次找到的最小数的下标 for (int i = 0; i < n-1; i++) //控制次数,找n-1次 { k = i; for (int j = i+1; j < n; j++) { if (A[j] < A[k]) k = j; } if (i != k) //将最小数交换至前面 { temp = A[i]; A[i] = A[k]; A[k] = temp; } } for (int t = 0; t < n; t++) cout <

Java对象排序、中文排序、SortedSet排序使用和源码讲解

大憨熊 提交于 2020-04-07 08:00:37
原文出处: xieyu_zy 在C、C++中有很多排序算法,但是通常排序算法不得不让程序员在写代码的过程中陷入对底层很多指针和位置的理解,java不希望这样,所以排序大多可以由java帮你做掉,例如,你要对一个数组排序,就通过: Collections.sort(list) 那么这个list就被排序了,排序最终调用的是 Arrays.sort 方法来完成的,所以数组自然是用 Arrays.sort 了,而 SortedSet 里面内部也有排序功能也是类似的方式的来实现的,只是内部调用了相关的方法来完成而已;SortedSet只是一个接口,实现类有很多,本文以 TreeSet 实现类作为例子。 而排序必然就存在对比大小,那么传递的信息,java是通过什么来对比大小的呢? compareTo 这个来对比的,而内部对比过程中,需要将数据转换为 Comparable 来对比,所以你的对象就需要implementsComparable,并实现内部的方法compareTo,只要你的compareTo实现是你所想要的,那么排序必然是正确的,那么是否还有其他的方法,有的,排序的时候,允许你传入一个对比类,因为这样也可以减少一些空指针出现的可能性,传入的类需要实现: Comparator 接口,实现其方法:compare类,虽然接口中还定义了equals方法基本不用管它,因为Object就已经实现了

内部排序算法系列---直接选择排序

拟墨画扇 提交于 2020-04-06 20:06:17
常见的内部排序分类: 我们来看下直接选择排序,其实思路很简单,就是从第一个数字开始依次跟后面的数字进行比对来交互位置,每一趟可以找出一个最小的;但是需要经过n-1趟比较。直接上程序吧: import java.util.Arrays; /** * @author stefanie zhao * @date 2014-9-25 下午04:09:48 */ public class SelectSort { public static void selectSort(DataWrap[] data){ System.out.println("begin sort......"); int arrayLength = data.length; for(int i = 0 ; i <= arrayLength - 1 ; i++){ for(int j = i + 1 ; j < arrayLength ; j++){ if(data[i].compareTo(data[j]) > 0){ DataWrap tmp = data[i]; data[i] = data[j]; data[j] = tmp; } } System.out.println(Arrays.toString(data)); } } public static void main(String[] args) {

链表排序

◇◆丶佛笑我妖孽 提交于 2020-04-06 11:46:53
//结构体 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; 插入排序(算法中是直接交换节点,时间复杂度O(n^2),空间复杂度O(1)) class Solution { public: ListNode *insertionSortList(ListNode *head) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(head == NULL || head->next == NULL)return head; ListNode *p = head->next, *pstart = new ListNode(0), *pend = head; pstart->next = head; //为了操作方便,添加一个头结点 while(p != NULL) { ListNode *tmp = pstart->next, *pre = pstart; while(tmp != p && p->val >= tmp->val) //找到插入位置 {tmp =

随机森林

落爺英雄遲暮 提交于 2020-04-06 09:37:51
0. 前言 sklearn提供了sklearn.ensemble库,其中包括随机森林模型(分类)。但之前使用这个模型的时候,要么使用默认参数,要么将调参的工作丢给调参算法(grid search等)。今天想来深究一下到底是如何选择参数,如何进行调参。 学会调参是进行集成学习工作的前提。参数可分为两种,一种是影响模型在训练集上的准确度或影响防止过拟合能力的参数;另一种不影响这两者的其他参数。模型的准确度由其在训练集上的准确度及其防止过拟合的能力所共同决定,所以在调参时,我们主要对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的平衡。 1. 集成学习是什么 集成学习通过构建并结合多个学习器来完成学习任务。 集成学习的一般结构:先产生一组“个体学习器”(individual learner),然后再用某种策略将它们结合起来。个体学习器通常有一个现有的学习算法从训练数据产生,此时集成中只包含同种类型的个体学习器,比如“决策树集成”,此时的集合里全部都是决策树。同质集成中的个体学习器称为 “基学习器” (base learner),相应的学习算法成为“基学习算法”(base learning algorithm)。 因为集成学习通过对多个“弱学习器”进行结合,可以获得比单一学习器更加显著的泛化性能,所以集成学习的很多理论研究是针对弱学习器的。因此“基学习器

四种排序算法

▼魔方 西西 提交于 2020-04-06 03:57:24
前言:经过昨天做的排序算法题,发现自己这么简单的题都忘记怎么做了,感觉很难受,今天复习整理了一遍,写成一个文章,以便日后复习,其中冒泡、选择、插入三种算法的思路和图片来自于B站up主"正月点灯笼",感谢你的讲解,我觉得你讲的非常好! 冒泡排序 例如 3、7、4、2、6、1这一个数组,我们对它进行升序的一个排序 1、首先从左往右两两进行比较,若左>右,则交换位置,进行第一趟排序 对于这第一趟的排序,并不能保证从左往右一定都是正确的升序排序,但是一定能保证最大的数已经排在了最右边 由此,我们可以得到一个思路,在第一趟排序后,我们只需要对这个长度为6的数组左边5个数字再进行一次冒泡排序,然后再对左边4个数字再进行一次冒泡排序,以此类推..... #include <stdio.h> /* 冒泡排序算法 */ /*** * @Description:交换函数,交换括号内的参数 * [@Param](https://my.oschina.net/u/2303379): &a,&b * [@return](https://my.oschina.net/u/556800): * [@Author](https://my.oschina.net/arthor): JaneRoad * [@Date](https://my.oschina.net/u/2504391): 2020/4/1 */

我说我不会排序算法,阿里就挂了我

女生的网名这么多〃 提交于 2020-04-05 22:40:05
前言 工作已经有一段时间了,有的时候会跟同事们打趣:“ 如果你让我现在去手写一个快速排序,我怕是真的写不出来 ”。 如果不接触一段时间的算法,真的很容易就忘了。不信?你现在想想你自己能不能手写一个堆排序。 经历过校招的人都知道, 算法和数据结构 都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以 排序 和各种的 基本数据结构 开始入门。我花了一个星期将 八大基础排序 和 链表/二叉树/栈/队列 制作成一份 精美的PDF 。 这份PDF阅读体验肯定是要比公众号和各大的博客平台的文章要好的。PDF内容 纯手打 ,有不懂的可以来问我。 下面来简单介绍一下八大基础排序和基础的数据结构,每种排序的思想和基础的 讲解和源码 在PDF里边有。 冒泡排序 思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要 n-1 趟排序(比如10个数,需要9趟排序) 代码实现要点: 两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数 。 每趟过后,比较的次数都应该要减1 选择排序

交换排序

烈酒焚心 提交于 2020-04-04 19:31:51
交换排序 基本思想: 是两两比较待排序对象的排序码,如发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有对象都排好序为止。 主要算法: 冒泡排序:BubbleSort 快速排序:QuickSort 冒泡排序 基本思想 设待排序元素序列中的元素个数为 n。最多作 n-1 趟,i = 1, 2, , n-1。在第 i 趟中从后向前,j = n-1, n-2, , i,顺次两两比较V[j-1].key和V[j].key。如果发生逆序,则交换V[j-1]和V[j]。 复杂度和稳定性 时间复杂度:Ω (n)和O(n 2 ) 空间复杂度:O(1) 稳定性:稳定 代码 static void quickSort(int[] nums, int left, int right){ if (right - left > 1){ int pos = helper(nums, left, right); quickSort(nums, left, pos - 1); quickSort(nums, pos + 1, right); } } static int helper(int[] nums, int left, int right){ int pos = left; //从left + 1开始,下标<=pos的是<pivot的数 int pivot = nums[left];