O(n^2) 级别的排序算法
o(n^2) 的排序算法。性能那么差,为什么还要学习?
首先,它是基础,千里之行,始于足下。它编码简单,容易实现,是一些简单情景的首选,它能给我们的问题一个暴力的解法,这样的解法也许不是最优的,但是它能给我们想出其他的优化算法一些启发,思路。
一、选择排序
选择排序是在给定的数据集合中,找出最小的值放在前面,依次类推,直到所有的元素都排序完成。
代码实现:
public static void selectionSorted(int arr[]
int n = arr.length;
for (int i = 0; i < n; i++) {
// 在[i...n] 闭区间中寻找最小值
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[i]) {
minIndex = j;
}
SortedHandler.swap(arr, minIndex, i);
}
}
}
二、插入排序
基本操作的插入排序 (其实这样性能是低于选择排序的)
public static void insertSorted(int[] arr) {
int n = arr.length;
// 从数组的第二个元素开始循环数组
for (int i = 1; i < n; i++) {
// 将第 i 个元素插入到 [0...j-1] 闭区间中的合适位置,
// 这里的 j 不用等于 0 ,说明j的最后一个比较的元素是 该数组的 下标为0 的元素
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j - 1])
SortedHandler.swap(arr, j, j - 1);
else
break;
}
// 第二层循环的第二种写法,
// 如果 arr[j] < arr[j-1] 的话,退出本次的内层循环,
// 从这里也可以看出插入排序的性能其实是由于选择排序的,尽管它们的时间复杂度都是 O(n)
// for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {
// SortedHandler.swap(arr, j, j - 1);
// }
}
}
改进版本的插入排序(性能高于选择排序)
对于近乎有序的数组,它的表现可能更高于O(logn)级别的算法。
public static void insertSorted(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int tmp = arr[i];
int j; // tmp元素应该存放的位置
for (j = i; j > 0 && arr[j - 1] > tmp; j--) {
arr[j] = arr[j - 1];
}
arr[j] = tmp;
}
}
三、 冒泡排序
public void bubbleSorted (int arr [] ) {
int n = arr.length;
for ( int i =0; i < n -1; i++ ) {
for ( int j =0; j < n -1 -i; j++) {
if ( arr[ j ] > arr[ j+1 ]){
SortedHandler.swap(arr, j, j + 1);
}
}
} }
O(n^2) 级别的排序算法的更多相关文章
- 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
知乎上有一个问题是这样的: 堆排序是渐进最优的比较排序算法,达到了O(nlgn)这一下界,而快排有一定的可能性会产生最坏划分,时间复杂度可能为O(n^2),那为什么快排在实际使用中通常优于堆排序? 昨 ...
- Java面试宝典系列之基础排序算法
本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- 八大排序算法Java实现
本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排 ...
- 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
总述:排序是指将元素集合按规定的顺序排列.通常有两种排序方法:升序排列和降序排列.例如,如整数集{6,8,9,5}进行升序排列,结果为{5,6,8,9},对其进行降序排列结果为{9,8,6,5}.虽然 ...
- 6种基础排序算法java源码+图文解析[面试宝典]
一.概述 作为一个合格的程序员,算法是必备技能,特此总结6大基础算法.java版强烈推荐<算法第四版>非常适合入手,所有算法网上可以找到源码下载. PS:本文讲解算法分三步:1.思想2.图 ...
- 经典排序算法 — C# 版(上)
提起排序,与我们的息息相关,平时开发的代码少不了排序. 经典的排序算法又非常多,我们怎么评价一个排序算法的好坏呢? 其实可以这样想,要细致的比较排序算法好坏,那我们就从多方面尽可能详细的对比 一.效率 ...
- 机器学习排序算法:RankNet to LambdaRank to LambdaMART
使用机器学习排序算法LambdaMART有一段时间了,但一直没有真正弄清楚算法中的所有细节. 学习过程中细读了两篇不错的博文,推荐给大家: 梯度提升树(GBDT)原理小结 徐博From RankNet ...
随机推荐
- .net 实现远程控制 远程协助
一个同事 用c#实现的远程协助功能 服务端 负责客户端连接 转发 客户端 1.开启服务端 2.客户端 3.输入对方用户名 点击控制
- uva1619
分析:这个题的关键是要找到,当某个值是最小值时它最大的影响区间时什么.可以通过单调队列(单调栈)在nlogn的时间内实现 #include <cstdio> #include <cs ...
- selenium2 用Yaml文件进行元素管理 (五)
比如界面有一个按钮,id号是test.如果进行对象化的话,就是test.click就可以了.不用每次都要去创建test对象.如果id号变了,我们也只需要改一下test的名称就行了. 使用Yaml需要用 ...
- Codeforces 1109C 线段树
题意及思路:https://www.cnblogs.com/TinyWong/p/10400682.html 代码: #include <bits/stdc++.h> #define ls ...
- HighCharts SVN IReport进行PDF报表设计--模板
BOS物流项目笔记第十五天 HIghcharts是很强大的图表绘制插件,它是基于纯js绘制的.当然地,对于图表也会有很多操作了.下面就我工作时遇到的一些比较常见的highcharts的操作进行小结,不 ...
- 关闭是否只查看安全传送的网页内容提示框 和 是否允许运行软件,如ActiveX控件和插件提示框
关闭是否只查看安全传送的网页内容提示框 最新编写 爬虫程序,运行程序后,电脑就总是出现下面这个提示框,一遍遍点"是"或"否"繁琐又麻烦.我看得有点不耐烦了.于是 ...
- PCL 平面模型分割
点云操作中,平面的分割是经常遇到的问题,下面的例子就是如何利用PCL库提拟合出的参数,之后就可以过滤掉在平面附近的点云. #include <iostream> #include < ...
- Luogu 4949 最短距离
这就是个水题. 一开始想把整个环找出来断开当一条链,然后其他部分正常链剖,两个点之间的路径如果经过环就考虑一下走哪边更快. 但是这样子还是太麻烦了. 我们可以直接断开环上的一条边,然后正常链剖,只要在 ...
- CF547D Mike and Fish
欧拉回路,巧妙的解法. 发现每一个点$(x, y)$实际上是把横坐标和$x$和纵坐标$y$连一条线,然后代进去跑欧拉回路,这样里一条边对应了一个点,我们只要按照欧拉回路间隔染色即可. 注意到原图可能并 ...
- 9.python 系统批量运维管理器之Fabric模块
前面介绍了paramiko,pexpect模块,今天来说比较适合大型应用自动化部署的模块,或者执行系统命令的模块Fabric. Fabric 是一个 Python 的库,同时它也是一个命令行工具.它提 ...