排序算法

Java集合类——Set、List、Map、Queue接口

旧街凉风 提交于 2020-03-29 20:23:42
目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定且不可变,如果我们需要保存一个动态增长的数据(其数量不确定),Java集合类可以很好实现。 集合类又称为容器类。所有的集合类都位于 java.util 包下,为了处理多线程环境下的并发安全问题,在 java.util.concurrent 包下提供了一些多线程支持的集合类。 Java集合类可分为两大类: 1)Collection : 1.1)List必须保持元素特定的顺序 1.2)Set不能有重复元素 1.3)Queue保持一个队列(先进先出)的顺序 2)Map : 保存的是一组 “键值对” 对象 (key-value对) 【虚线箭头表示实现关系,实线箭头表示继承关系】 二. Java集合类的层次关系 1. Iterable<T> 接口 java.lang 下的 Interface Iterable<T> 迭代器接口,是Collecton接口的父接口,包括 default void forEach() 方法 Iterator<T> iterator() 方法 【Iterator<T> 是java.util 下的接口】 实现这个Iterable接口的对象允许使用foreach进行遍历

Java集合类: Set、List、Map、Queue使用

自作多情 提交于 2020-03-29 20:23:20
目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的,如果我们需要保存一个可以动态增长的数据(在编译时无法确定具体的数量),java的集合类就是一个很好的设计方案了。 集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所以的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,java5还在java.util.concurrent包下提供了一些多线程支持的集合类。 在学习Java中的集合类的API、编程原理的时候,我们一定要明白,"集合"是一个很古老的数学概念,它远远早于Java的出现。从数学概念的角度来理解集合能帮助我们更好的理解编程中什么时候该使用什么类型的集合类。 Java容器类类库的用途是"保存对象",并将其划分为两个不同的概念: 1) Collection 一组"对立"的元素,通常这些元素都服从某种规则   1.1) List必须保持元素特定的顺序   1.2) Set不能有重复元素   1.3) Queue保持一个队列(先进先出)的顺序 2) Map 一组成对的

Java 冒泡排序(应付面试篇)

南楼画角 提交于 2020-03-28 12:59:59
因为之前写过C++的一些算法,觉得好多东西其实挺简单的,可是有一次面试让我自己写一个排序算法,最后倒腾了半天都感觉不太对的样子,今儿个自己琢磨琢磨调试了一个程序,算是为以后面试当干粮吧,有时间把所有的算法都整理一下写出来。 package homework; public class BubbleSort { public static void main (String[] args){ int arr[] = {1,2,3,4,9,6,3,11}; int temp; for (int i =0;i<arr.length;i++){ for (int j=i+1; j<arr.length;j++){ if(arr[i]>arr[j]){ temp = arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } for (int i=0; i<arr.length;i++){ System.out.println(arr[i]); } } } 来源: https://www.cnblogs.com/luoluode2015/p/4359806.html

让天下没有难用的搜索:阿里搜索如何成长为贴心“暖男”?

亡梦爱人 提交于 2020-03-28 08:41:01
阿里搜索技术体系演进至今天,基本形成了由offline、nearline、online三层体系,分工协作,保证电商平台上,既能适应日常平稳流量下稳定有效的个性化搜索及推荐,也能够去满足电商平台对促销活动的技术支持,实现在短时高并发流量下的平台收益最大化。 可以看到,十年双11的考验后,搜索智能化体系逐渐打造成型,已经成为电商平台稳定健康发展的核动力,主要分为四个阶段:自主研发的流式计算引擎Pora初露锋芒;双链路实时体系大放异彩;“深度学习+强化学习”初步探路;全面进入深度学习时代。下面我们就来一起看一下。 四大演进阶段:业务、算法、系统同步发展 阶段一:初露锋芒——自主研发的流式计算引擎Pora 技术的演进是伴随解决实际业务问题和痛点发展和进化的。2014年双11,通过BI团队针对往年双11的数据分析,发现即将售罄的商品仍然获得了大量流量,剩余库存无法支撑短时间内的大用户量。主售款(热销sku)卖完的商品获得了流量,用户无法买到商品热销的sku,转化率低;与之相对,一些在双11当天才突然展露出来的热销商品却因为历史成交一般没有得到足够的流量。 针对以上问题,通过搜索技术团队自主研发的流式计算引擎Pora,收集预热期和双11当天全网用户的所有点击、加购、成交行为日志,按商品维度累计相关行为数量,并实时关联查询商品库存信息,提供给算法插件进行实时售罄率和实时转化率的计算分析

归并排序

风流意气都作罢 提交于 2020-03-28 08:18:18
问题描述: 通过归并排序,从小到大排序一个数组。 算法实现: 相关变量初始化:    int num = 8; int[] arr = new int[num]; int[] temp = new int[num];算法调用: mergeSort(arr, 0, arr.length - 1, temp);主要方法: public void mergeSort(int[] arr, int lo, int hi, int[] temp) { if(lo >= hi) return; int mid = lo + (hi - lo) / 2; mergeSort(arr, lo, mid, temp); mergeSort(arr, mid + 1, hi, temp); merge(arr, lo, mid, hi, temp);}private void merge(int[] arr, int lo, int mid, int hi, int[] temp) { int i = lo; int j = mid + 1; for(int k = lo; k <= hi; k++) { temp[k] = arr[k]; } for(int k = lo; k <= hi; k++) { if(i > mid) arr[k] = temp[j++]; else if(j > hi)

归并排序基本原理及实现

陌路散爱 提交于 2020-03-28 04:29:09
一、归并(Merge) 1. 概念 将两个 有序数列 合并成一个有序数列,我们称之为 “归并”。 2. 算法思路及实现 设两个有序的子序列(相当于输入序列)放在同一序列中相邻的位置上:array[low..m],array[m + 1..high],先将它们合并到一个局部的暂存序列 temp (相当于输出序列)中,待合并完成后将 temp 复制回 array[low..high]中,从而完成排序。 在具体的合并过程中,设置 i,j 和 p 三个指针,其初值分别指向这三个记录区的起始位置。合并时依次比较 array[i] 和 array[j] 的关键字,取关键字较小(或较大)的记录复制到 temp[p] 中,然后将被复制记录的指针 i 或 j 加 1,以及指向复制位置的指针 p 加 1。重复这一过程直至两个输入的子序列有一个已全部复制完毕(不妨称其为空),此时将另一非空的子序列中剩余记录依次复制到 array 中即可。 c语言实现如下: void merge(int* array, int low, int mid, int high) { assert(array && low >= 0 && low <= mid && mid <= high); int* temp = (int*)malloc((high - low + 1) * sizeof(int)); if (!temp

排序算法:冒泡排序

一世执手 提交于 2020-03-27 13:31:21
什么是冒泡排序? 冒泡排序是一种最基础的交换排序,它就是把相邻的元素两两进行比较,根据大小来交换元素的位置,把较小的元素放在前面较大的元素放在后面,重复‘比较’‘交换’操作,最终实现数组有序的效果。 原理图如下: 实现步骤: (1) 比较相邻两个元素的大小,然后把较小的数放在前面,较大的数放在后面。 (2) 经过n-1次比较后,最大的那个元素会沉到数组中第n-1个的位置 (3) 如果n-1大于0,就继续重复1,2 否则排序完成。 时间复杂度: 该排序算法在最好情况下(元素是完全有序的)时间复杂度是O(n),最坏情况下(元素是完全逆序的)时间复杂度是O(n²)。 冒泡排序、选择排序、插入排序时间复杂度都是O(n²) 稳定性: 数组中相同的值,经过排序后位置不变表示该排序算法是稳定的,否则是不稳定的。冒泡排序和插入排序是稳定排序,选择排序是不稳定排序。 冒泡排序第一版: public static int[] bubbleSort(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = 0; temp = arr[j]; arr[j] = arr[j+1]; arr[j

C/C++ 数据结构之算法(面试)

独自空忆成欢 提交于 2020-03-27 08:16:46
数据结构中的排序算法。 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。 (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的。相反,如果发生改变,这种排序方法不稳定。 (3)排序算法的分类(分为5类):插入排序、选择排序、交换排序、归并排序和分配排序。 (4)排序算法两个基本操作:<1>比较关键字的大小。 <2>改变指向记录的指针或移动记录本身。 具体的排序方法: 插入排序 <1>插入排序(Insertion Sort)的思想:每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子记录中的适当位置,直到全部记录插入完成为止。 <2>常用的插入排序方法有直接插入排序和希尔排序。 (1)直接插入排序 <1>算法思路:把一个记录集(如一个数组)分成两部分,前半部分是有序区,后半部分是无序区;有序区一开始有一个元素r[0],无序区一开始是从r[1]到之后的所有元素;然后每次从无序区按顺序取一个元素r[i],拿到有序区中由后往前进行比较,每次比较时,有序区中比r[i]大的元素就往后移动一位,直到找到小于r[i]的元素,这时r[i]插到小元素的后面,则完成一趟直接插入排序。如此反复,从无序区不断取元素插入到有序区,直到无序区为空

排序总结

白昼怎懂夜的黑 提交于 2020-03-27 06:28:30
排序 代码实现: Sort方法GitHub 基于比较 的排序算法时间下限是O(nlogn):归并排序、堆排序、快排。其他都是O(n^2) 插入排序 直接插入 循环n-1次,每次将无序序列的第一个数插入到有序序列中。一开始有序序列只有一个数(第一个数),之后每插入一个有序序列+1 将第一个数作为哨兵,每次移动都将插入位置后到该数前的所有数往后移动一位 时间复杂度 :O(n^2) 最好情况:已经是有序序列,只用比较n-1次(因为是从后往前比较),不用移动。 最坏情况:逆序序列,每次向前比较到哨兵 空间复杂度 :O(1) 稳定 折半插入 其实是在直接插入的基础上,将无序序列的第一个数在有序序列中查找的时候变为折半查找 移动次数和直接插入相同,依赖于初始序列 时间复杂度 :O(n^2) 空间复杂度 :O(1) 稳定 希尔排序 将一组序列分组进行排序(隔5个数一组,隔3个一组...) 做到基本有序后对全体进行直接插入,因为基本有序,所以比较和插入次数能有效减少 时间复杂度 :O(n 1.25)~O(1.6n 1.25) 空间复杂度 :O(1) 不稳定 交换排序 冒泡排序 进行n-1次,从第一个数开始,两两比较,把大的数放后面。从而每次排序能确定最大的数并放到最后 当某次冒泡过程中不存在数值交换,则已为正序,不用再进行排序 时间复杂度 :O(n^2) 最好情况:正序,进行一次排序,比较n-1次

各种排序算法探讨与实现

可紊 提交于 2020-03-26 04:16:20
本文对各个排序算法进行了一点复习整理,并通过一段代码对几种排序算法进行了实现。这包括:冒泡排序,插入排序,选择排序,希尔排序,堆排序,归并排序,快速排序,基数排序,计数排序等。相关简要讨论在程序中有一定说明。 各种算法实现见以下示例代码: /******************************************************************* *各种排序算法示例程序---By F8Master */ #include<stdlib.h> #include<iostream> #include<vector> #include<iomanip> using namespace std; template <class Comparable> void bubbleSort(vector<Comparable> &a); template<typename Comparable> void insertSort(vector<Comparable> &a); template<typename Comparable> void selectSort(vector<Comparable> &a); template<typename Comparable> void shellSort(vector<Comparable> &a); template