排序算法

集合相关的常用工具类

半城伤御伤魂 提交于 2020-03-11 14:47:21
1. 简介 Java中的集合类既可以当做放其他数据的容器,又可以当做常见的数据结构使用。Java中提供了很多好用的工具类来操作这些集合类。本篇博客就来介绍下常用的集合工具类。集合常用的工具类大体可以分为3类: JDK本身提供的工具类; Guava提供的工具类; Apache common-Collection提供的工具类 2. JDK提供的工具类 主要由下面三个: Arrays Collections Objects Arrays 是操作数组对象的工具类, Collections 是操作集合对象的工具类。 Objects 是操作引用数据类型对象的工具类。 Arrays的常用方法: 普通 排序 : Arrays.sort(int[] a) Arrays.sort(int[] a, int fromIndex, int toIndex) 其他非boolean基础数据类型的数组对象以及实现Comparable接口的类的数组对象均有此方法。 并行排序 :JDK1.8新增。 Arrays.parallelSort(int[] a) Arrays.parallelSort(int[] a, int fromIndex, int toIndex) 其他非boolean基础数据类型的数组对象以及实现Comparable接口的类的数组对象均有此方法。 并行计算 :JDK1.8新增,支持函数式编程

《STL源码剖析》Sort排序分析

孤者浪人 提交于 2020-03-11 12:08:15
整体而言: sort算法在数据量大时采用Quick Sort(快速排序),一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负担,就改用Insertion Sort(插入排序),如果递归层次过深,还会改用Heap Sort(堆排序),先分别简单介绍Quick Sort Insertion Sort插入排序 Insertion sort以双层循环的形式进行,外循环便利整个序列,每次迭代决定出一个自区间,内循环遍历自区间,将自区间内的没一个“逆转对”倒转过来。所谓“逆转对”是指任何两个迭代器i,j,i template<class RandomAccessIterator> void __insertion_sort(RandomAccessIterator first,RandomAccessIterator last){ if(first==last) return; for(RandomAccessIterator i=first+1;i!=last;++i)//外循环 __linear_insert(first,i,value_type(first)); //以上[first,i)形成一个子区间 } template <class RandomAccessIterator,class T> inline void__linear_insert

3月5日笔记

若如初见. 提交于 2020-03-11 03:21:07
3月5日学习 一、算法学习 1、归并排序 2、堆排序 一、算法学习 1、归并排序 代码 : # include <iostream> # include <string> # include <cstring> # include <algorithm> # include <memory> # include <functional> using namespace std ; void merge ( int a [ ] , int l , int mid , int r ) { //cout<<"l:"<<l<<endl; //cout<<"r:"<<r<<endl; //cout<<"mid:"<<mid<<endl; int help [ 100 ] ; int p1 = l ; int p2 = mid + 1 ; int i = 0 ; while ( p1 <= mid && p2 <= r ) { if ( a [ p1 ] <= a [ p2 ] ) { help [ i ++ ] = a [ p1 ++ ] ; } else { help [ i ++ ] = a [ p2 ++ ] ; } } while ( p1 <= mid ) { help [ i ++ ] = a [ p1 ++ ] ; } while ( p2 <= r ) { help [ i

一些关于排序算法的总结

送分小仙女□ 提交于 2020-03-11 02:42:03
排序算法 平均时间复杂度 冒泡排序 O(n^2) 选择排序 O(n^2) 插入排序 O(n^2) 希尔排序 O(n^1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*logN) 基数排序 O(d(n+r)) ①冒泡排序(BubbleSort) 基本思想: 两个数比较大小,较大的数下沉,较小的数冒起来。 过程: 比较相邻的两个数据,如果第二个数小,就交换位置。 从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。 继续重复上述过程,依次将第2.3…n-1个最小数排好位置。 平均时间复杂度: O(n^2) java代码实现: public static void BubbleSort ( int [ ] arr ) { int temp ; //临时变量 for ( int i = 0 ; i < arr . length - 1 ; i ++ ) { //表示趟数,一共arr.length-1次。 for ( int j = arr . length - 1 ; j > i ; j -- ) { if ( arr [ j ] < arr [ j - 1 ] ) { temp = arr [ j ] ; arr [ j ] = arr [ j - 1 ] ; arr [ j - 1 ] = temp

面试笔记 | 排序算法

非 Y 不嫁゛ 提交于 2020-03-10 12:37:20
引用于 菜鸟教程 排序算法 01 堆排序 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列; 02 快速排序 03 归并排序 来源: CSDN 作者: 大虎牙 链接: https://blog.csdn.net/qq_34170700/article/details/104769866

排序算法 -- 选择排序(SelectSort)

a 夏天 提交于 2020-03-10 03:56:37
一、选择排序思想 选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从 arr[0]~arr[n-1] 中选取最小值,与 arr[0]交换,第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换,…,第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[i-1]交换,…, 第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值, 与 arr[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。 二、选择排序图示 三、java 编写选择排序代码 package point2 ; import java . util . Arrays ; /** * @description: 选择排序 * @author: hyr * @time: 2020/1/25 19:40 */ public class SelectSort { // 测试 public static void main ( String [ ] args ) { int [ ] arr = { 1 , - 3 , 5 , 6 , 9 , 3 } ; SelectSort . selectSort ( arr ) ; } //

分治思想与归并排序

主宰稳场 提交于 2020-03-09 22:00:04
分治法 的思想: 将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些自问题,然后再合并这些自问题的解来建立原问题的解。 分支模式在每层递归时都有三个步骤: 分解 原问题为若干子问题,这些子问题是原问题的规模较小的实例。 解决 这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。 合并 这些子问题的解成原问题的解。 归并排序 算法完全遵循分治模式。直观上其操作如下: 分解: 分解待排序的n个元素的序列成各具n/2个元素的两个子序列。 解决: 使用归并排序递归地排序两个子序列。 合并: 合并两个已排序的子序列以产生已排序的答案。 参考: 《算法导论》中文版原书第3版Page16,17 来源: https://www.cnblogs.com/drfxiaoliuzi/p/5892158.html

归并排序

大兔子大兔子 提交于 2020-03-09 21:59:06
分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归求解这些子问题,然后再合并这些子问题的解来建立原问题的解。主要包括三个主要步骤:1、分解原问题 ;2、解决子问题;3、合并子问题的解 归并排序遵循分治模式,算法的时间复杂度是O(NlogN),属于稳定排序。直观操作为: 分解 :分解待排序的n个元素的序列成各具有n/2个元素的两个子序列。 解决 :使用归并排序递归地排序两个子序列。 合并 :合并两个已排序的子序列以产生已排序的答案。 具体算法由一个辅助函数和一个递归函数组成: 函数代码: #include<iostream> using namespace std; #define INF 65535 template<class T> void Merge(T *A, int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; T *L = new T[n1 + 1]; T *R = new T[n2 + 1]; for (int i = 0; i<n1; i++){ L[i] = A[p + i]; } for (int j = 0; j<n2; j++){ R[j] = A[q + j + 1]; } L[n1] = INF; R[n2] = INF; int i = 0,j = 0; for (int

排序算法(三)

不羁岁月 提交于 2020-03-09 18:13:30
1.计数排序 核心思想: 对于输入的数据x存入标记为x的数组中,并统计x的个数。 适用于数据范围小,数据量大的情况。 算法的步骤如下: 1.找出待排序的数组中最大和最小的元素 2.统计数组中每个值为i的元素出现的次数,存入数组C的第i项 3.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加) 4.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个 元素就将C(i)减去1 文章 2.基数排序 核心思想 : 分配+收集 基数排序又称为“桶子法”,从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。 算法执行步骤: (1)遍历序列找出最大的数(为的是确定最大的数是几位数); (2)开辟一个与数组大小相同的临时数组tmp; (3)用一个count数组统计原数组中某一位(从低位向高位统计)相同的数据出现的次数; (4)用一个start数组计算原数组中某一位(从最低位向最高位计算)相同数据出现的位置; (5)将桶中数据从小到大用tmp数组收集起来; (6)重复(3)(4)(5)直到所有位都被统计并计算过,用tmp收集起来; (7)将tmp数组拷回到原数组中; 文章 3.桶排序 核心思想: 将数据划分多个范围相同的区间,每个区间排序,最后合并。 文章

C++从入门开始讲算法(1)

China☆狼群 提交于 2020-03-09 12:12:57
以下内容来自于洛谷网站 本文章仅是讲一个目录,细节会在之后的文章中出现 大家请拿起手中的纸和笔,认真做笔记! 文章目录 1.顺序结构 2.分支结构 3.循环结构 4.数组 5.字符串 6.函数与结构体 7.排序 8.高精度算法与模拟 9暴力枚举 10 递归递推 11.贪心 12.二分 13。搜索 14.线性表 15.二叉树 16.集合 17.图的基本应用 1.顺序结构 千里之行,始于足下。程序设计虽然花样繁多,但还是要从最简单的地方开始学习,由浅入深,直至掌握。毕竟任何复杂的工程代码都是由一行行简单的代码组成的。 我们编写计算机程序,将一个任务分解成一条一条的语句,计算机会按照顺序一条一条的执行这些语句,这就是顺序结构程序设计。 2.分支结构 人们在人生中需要做出许多选择,小到考虑晚上吃什么,大到决定高考志愿填报的学校。只有一次次选择后才能带来无限可能,我们要根据自己掌握的情况,做出最佳的选择。 程序的执行也不是一成不变的,往往会要求程序能够在不同的场合下有不同的动作。这时就需要在代码中使用条件语句来做出不同的选择。比如说,登录洛谷网时,网站后台会将你提交的用户名和密码在后台数据库中看看是否匹配,如果能够匹配就登陆成功,否则就登陆失败。这一章就来介绍如何让程序做出选择。 3.循环结构 虽然计算机可以在短时间批量处理成千上万条指令,但是不少问题中有许多规律性的重复操作