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 ...
随机推荐
- React 常用面试题目与分析
调用 setState 之后发生了什么? 在代码中调用setState函数之后,React 会将传入的参数对象与组件当前的状态合并,然后触发所谓的调和过程(Reconciliation).经过调和过程 ...
- Ceph基本情况介绍
Ceph基本情况的介绍 Ceph是一个分布式存储软件. 它支持用3种方式存储数据,分别是:对象存储.块设备存储.分布式文件系统存储. Ceph最初的目标是做一个分布式文件系统,直到现在这个目标也不能算 ...
- IIS设置Access-Control-Allow-Origin
打开iis,找到“HTTP响应标头”点进去, 在右侧可以看到添加,然后添加如下标头即可Access-Control-Allow-Headers:Content-Type, api_key, Autho ...
- Leetcode:Merge k Sorted Lists分析和实现
题目大意是传入一个链表数组lists,每个链表都由若干个链接的链表结点组成,并且每个链表结点记录一个整数.题目保证传入的链表中的整数按从小到大进行排序. 题目要求我们输出一个新的链表,这个链表中应该包 ...
- Leetcode:Longest Palindromic Substring分析和实现
问题大意是在给定字符串中查找最长的回文子串,所谓的回文就是依据中间位置对称的字符串,比如abba,aba都是回文. 这个问题初一看,非常简单,但是会很快发现那些简单的思路都会带来O(n^3)级别的时间 ...
- 【HDU5861】Road
题意 有n个村庄排成一排,有n-1条路将他们连在一起.每条路开放一天都会花费一定数量的钱.你可以选择打开或者关上任意条路在任意一天,但是每条路只能打开和关闭一次.我们知道m天的运输计划.每天都有一辆马 ...
- XHProf安装使用笔记
编译安装 获取源代码包root@sourcjoy>wget http://pecl.php.net/get/xhprof-0.9.2.tgz解压root@sourcjoy>tar zxf ...
- Visual Studio + C# + Xamarin = iOS/Android/Windows Apps
Visual Studio 跨平台開發實戰 (1) -- Hello Xamarin! 前言 應用程式發展的腳步,從來沒有停過.從早期的 Windows 應用程式, 到網路時代的 web 應用程式,再 ...
- java 从jsp页面传集合给controller
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- 数据库sql 开窗函数
--本文采用Oracle数据库测试,前4个查询为一组,后2个查询为一组,每组前面的查询是为了推出最后的查询 --创建表,为了简化处理,字段类型都采用varcharcreate table tb_sc( ...