ALGO基础(一)—— 排序
ALGO基础(一)—— 排序
- 冒选插希快归堆,以下均为从小到大排
1 冒泡排序
描述:
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
- 针对所有的元素重复以上的步骤,除了最后一个;
- 重复步骤1~3,直到排序完成。
public void bubbleSort(int[] nums){ //每次从头开始把最大的放到最后
int len = nums.length;
for(int i = 0;i<len-1;i++){ [0,len-1)
for(int j = 0;j<len-i-1;j++){ [0,len-i-1)
if(nums[j]>nums[j+1]){
int tmp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = tmp;
}
}
}
}
2 选择排序
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
public void select(int[] nums){
int len = nums.length-1;
for(int i = 0;i<len-1;i++){ [0.len-1)
int index = i; //最小值下标
for(int j = i+1;j<len;j++) [i+1,len)
if(nums[j]<nums[index]) index = j;
//交换
int tmp = nums[i];
nums[i] = nums[index];
nums[index] = tmp;
}
}
3 插入排序
一次插一个,插一个排一次
public void insert(int[] nums){
int len = nums.length; // 从下标为1的元素开始选择位置插入,因为下标为0的只有一个元素,默认是有序的
for (int i = 1; i < len; i++) { [1,len)
int temp = nums[i]; // 记录要插入的数据
// 从已经排序的序列最右边的开始比较,找到比其小的数
for (int j = i; j > 0&&nums[j-1] > temp; j--) [i.0) j-- && nums[j] = nums[j-1];
nums[j] = temp;
}
}

4 希尔排序(最小增量排序)
先将要排序的一组数按某个增量step(n/2,n为要排序数的 个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行插入排序,然后再用一个较小的增量(step/2)对它进行分组,在每组中再进行直接插入 排序。当增量减到1时,进行直接插入排序后,排序完成
希尔排序为什么效率高?
- 插入排序如果在后面来了一个特别小的元素,需要全部移动,那么排序的效率特别低。
- 希尔排序最重要的就是步长,让步长不断地除以二,直到步长为1,优点是如果在数组最后加入一个小元素,他会被很快移到最前面。
public static void shellSort(int[] nums) {
int len = nums.length;
int temp;
for (int step = len / 2; step >= 1; step /= 2) {
// 从下标为step的元素开始选择位置插入,因为前面的魅族只有1个,默认是有序的
for (int i = step; i < len; i++) { [step,len)
temp = nums[i]; // 记录要插入的数据
// 从已经排序的组序列最右边的开始比较,找到比其小的数
for (int j = i; j > 0&&nums[j-step] > temp; j-=step) [i.0) j- && nums[j] = nums[j-step];
nums[j] = temp;
}
}
}

5 快速排序
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
public void quick(int[] nums, int low, int high) {
if (low < high) {
int middle = getMiddle(nums, low, high);// 将数组进行一分为二
quick(nums, low, middle - 1); // 对低字表进行递归排序
quick(nums, middle + 1, high);// 对高字表进行递归排序
}
} private int getMiddle(int[] nums, int low, int high) {
int tmp = nums[low]; // 数组的第一个作为中轴
while (low < high) {
while (low < high && nums[high] >= tmp) {
high--;
}
nums[low] = nums[high]; // 比中轴小的记录移到低端
while (low < high && nums[low] <= tmp) {
low++;
}
nums[high] = nums[low]; // 比中轴大的记录移到高端
}
nums[low] = tmp; // 中轴记录到尾
return low; // 返回中轴的位置
}
6 归并排序
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。自上而下的递归。
public void mergeSort(int[] nums,int left,int right){
if(left<right){
//找出中间索引
int center=(left+right)/2;
//对左边数组进行递归
mergeSort(nums,left,center);
//对右边数组进行递归
mergeSort(nums,center+1,right);
//合并
merge(nums,left,center,right);
}
} private void merge(int[] nums, int left, int center, int right) {
int [] tmpArr=new int[nums.length];
int mid=center+1;
//third记录中间数组的索引
int third=left;
int tmp=left;
while(left<=center&&mid<=right){
//从两个数组中取出最小的放入中间数组
if(nums[left]<=nums[mid]){
tmpArr[third++]=nums[left++];
}else{
tmpArr[third++]=nums[mid++];
}
}
//剩余部分依次放入中间数组
while(mid<=right){
tmpArr[third++]=nums[mid++];
}
while(left<=center){
tmpArr[third++]=nums[left++];
}
//将中间数组中的内容复制回原数组
while(tmp<=right){
nums[tmp]=tmpArr[tmp++];
}
}

7 堆排序
ALGO基础(一)—— 排序的更多相关文章
- 算法与数据结构基础 - 拓扑排序(Topological Sort)
拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...
- 算法基础~链表~排序链表的合并(k条)
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
- javascript-几个基础的排序算法
对这几个基础排序算法进行梳理,便于以后查看. /** * * 冒泡排序 * 从末尾开始相邻两数相互比较大小,满足条件就交换位置.循环每进行一次,即可确定第i位数的值. *冒泡排序的时间复杂度为O(n^ ...
- C#_基础:排序算法
//希尔排序 static int[] ShellSort(int[] array) { if (array != null) { int[] list = { 9, 5, 3, 2, 1 }; fo ...
- HDU 1069 基础动态规划+排序
题意 给出n种立方体石头 当且仅当一块石头的底部宽度长度都小于一块石头的时候才能放在上面 问最高能放多高?石头不限数目 然而同样一种石头采用同样的摆放方式 两快相同石头一定无法进行放置 所以 一块石头 ...
- iOS开发基础之排序
Objective-C 有排序的API,省了我们很多事. 主要有以下3种方法. NSComparator NSArray *unsortedArray = @[@5,@3,@8,@1,@7]; NSA ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- Go基础之--排序和查找操作
排序操作主要都在sort包中,导入就可以使用了import("sort") 常用的操作 sort.Ints:对整数进行排序sort.Strings:对字符串进行排序sort.Flo ...
- python基础一 ------排序和查找算法
插入排序; 假设数组长度为n,先从第二个元素开始,与前一个元素比较,之后将较小的元素 放在前面,现在前两个元素是有顺序的,这时取第三个元素,与前一个元素(也就是第二个)比较,较小的放在前面 ...
随机推荐
- 秒啊,速来get这9个jupyter实用技巧
1 简介 jupyter notebook与jupyter lab作为广受欢迎的ide,尤其适合开展数据分析相关工作,而掌握它们相关的一些实用技巧,势必会大大提升日常工作效率.而今天我就来给大家介绍9 ...
- 从云数据迁移服务看MySQL大表抽取模式
摘要:MySQL JDBC抽取到底应该采用什么样的方式,且听小编给你娓娓道来. 小编最近在云上的一个迁移项目中被MySQL抽取模式折磨的很惨.一开始爆内存被客户怼,再后来迁移效率低下再被怼.MySQL ...
- Codeforces Round #635 (Div. 1)
传送门 A. Linova and Kingdom 题意: 给定一颗以\(1\)为根的树,现在要选定\(k\)个结点为黑点,一个黑点的贡献为从他出发到根节点经过的白点数量. 问黑点贡献总和最大为多少. ...
- HttpServletResponse的学习
关于Response对象的一些方法和属性可以查看官方文档:https://javaee.github.io/javaee-spec/javadocs/ 比如里面定义了许多常量: 这些都是服务器向浏览器 ...
- 【noi 2.5_8465】马走日(dfs)
最基本的dfs.这代码理应超时的,我也不知为何AC了......打表我都放弃了,因为最大的数据真的要跑很久...... 1 #include<cstdio> 2 #include<c ...
- IntelliJ IDEA 运行java程序时出现“程序发生找不到或无法加载主类 cn.test1.test1”错误
在你程序不出现错误,而且你的编译器已经成功导入后 成功导入的样子 你可以重新打开一个项目 这就可以了^_^
- 洛谷 P4017 最大食物链计数 (拓扑排序,思维)
题意:有\(n\)个点,连\(m\)条边,求最多有多少条食物链(从头走到为有多少条路径). 题解:之前抽了点时间把拓扑排序补完了,这题其实就是一道拓扑排序的裸题.关于拓扑排序: 1.首先,我们用\ ...
- Codeforces Round #531 (Div. 3) C. Doors Breaking and Repairing (博弈)
题意:有\(n\)扇门,你每次可以攻击某个门,使其hp减少\(x\)(\(\le 0\)后就不可修复了),之后警察会修复某个门,使其hp增加\(y\),问你最多可以破坏多少扇门? 题解:首先如果\(x ...
- [笔记]吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
开发的原因,需要对吞吐量(TPS).QPS.并发数.响应时间(RT)几个概念做下了解,查自百度百科,记录如下: 1. 响应时间(RT) 响应时间是指系统对请求作出响应的时间.直观上看,这个指标与人对软 ...
- k8s二进制部署 - dashboard安装
配置资源清单rbac.yaml apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: kubernetes-dashboard ...