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 ...
随机推荐
- 系统环境变量PATH被删除后从注册表恢复
转自:https://wenku.baidu.com/view/75d0b6ec19e8b8f67c1cb958.html 首先需要了解path这个环境变量有什么用: 当你打开命令提示窗口时,即win ...
- easyui之datagrid之formatter(后台传递常量自动转换值)
1,datagrid之formatter formatter格式化函数有三个参数: value:字段值(一般为后台传递给前台的值): row:当前行数据: index:当前行索引. return值是显 ...
- linux tcpdump补充
If they are going across the loopback interface, you may have to tell tcpdump to read that interface ...
- std::mutex与pthread mutex区别
Linux下 pthread mutex * PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁.当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁. ...
- PHP Liunx 服务安全防范方案
PHP100平均每个月都会有入侵或者攻击,我们做了很多工作,当然很多高手们还是可以入侵,这我们并不感到奇怪,因为我们相信天外有天,人外有人,虽然 我们现在服务器还是稳定(高手们不要来喷了),我们把我们 ...
- Composer安装(windows)
https://files.cnblogs.com/files/wlphp/Composer-Setup.zip 先下载这个安装包,一直下一步 然后设置composer全局中国景象 composer ...
- sqLSERVER 计划缓存
在这一期的性能调优培训里,我想详细谈下SQL Server里计划缓存及其副作用.在上一周你已经学到,每个提交给SQL Server的逻辑查询会编译成物理执行计划.那个执行计划然后会被缓存,即被称为计划 ...
- struts2 框架的基本使用
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- tensor 维度 问题。
tf.argmax takes two arguments: input and dimension. example: tf.argmx(arr, dimension = 1). or tf.arg ...
- Reading——The Non-Designer's Design Book
看这本书的时候真的好恨没有CS7在手><,不然我百度几张图来模拟下,体验下设计的快感. 人们总是很容易注意到在他们潜意识里存在的东西,比如说这个图: 我们很容易联想到微信,但是3 ...