选择排序和插入排序
来源:互联网 发布:数控车床电脑自动编程 编辑:程序博客网 时间:2024/05/22 00:31
选择排序
选择排序的设计思路是每次内层循环找出最小值放在上次最小值的后面来实现排序
算法复杂度:O(N*N)
它的两个鲜明的特点:
1.运行时间和输入没有关系
2.数据移动式最少的,每次交换只改变两个元素的值,交换次数和数组大小是线性关系
代码实现如下:
import edu.princeton.cs.algs4.StdOut;public class Selection { public static void sort(Comparable[] a){ int N = a.length; for(int i = 0;i<N;i++){ int min = i; for(int j = i;j<N;j++){ if(less(a[j],a[min])) min = j; } exch(a, i, min); } } private static boolean less(Comparable v,Comparable w){ return v.compareTo(w) < 0; } private static void exch(Comparable[] a, int i, int j){ Comparable t = a[i]; a[i] = a[j]; a[j] = t; } public static void show(Comparable[] a){ for(int i = 0;i<a.length;i++) StdOut.print(a[i] + " "); StdOut.println(); } public static boolean isSorted(Comparable[] a){ for(int i = 1;i<a.length;i++) if(less(a[i],a[i-1])) return false; return true; }}
插入排序
插入排序类似于整理桥牌,将一张牌插入到有序牌的适当位置。
适用范围:适用于数组中倒置的数量很少的时候,对部分有序的数组十分 高效,也适合小规模数组
时间复杂度是O(n*n),虽然两中排序方法复杂度都是平方级别的,但是对于随机排序的无重复主键的数组,插入排序稍稍比选择排序快一点因为选择排序在第二重循环时不需要全部遍历数组,而选择排序为了选出最大值或最小值会全部遍历。
代码实现如下:
import edu.princeton.cs.algs4.StdOut;public class Insertion { public static void sort(Comparable[] a){ int N = a.length; for(int i = 1;i<N;i++){ for(int j = i; j>0 && less(a[j],a[j-1]);j--) exch(a,j,j-1); } } private static boolean less(Comparable v, Comparable w){ return v.compareTo(w) < 0; } private static void exch(Comparable[] a,int i, int j){ Comparable t = a[i]; a[i] = a[j]; a[j] = t; } public static void show(Comparable[] a){ for(int i = 0;i<a.length;i++) StdOut.print(a[i] + " "); StdOut.println(); } public static boolean isSorted(Comparable[] a){ for(int i = 1;i<a.length;i++) if(less(a[i],a[i-1])) return false; return true; } public static void main(String args[]){ String[] a = {"tu", "35", "678", "qg"}; sort(a); show(a); }}
0 0
- 插入排序和选择排序
- 选择排序和插入排序
- 选择排序和插入排序
- 选择排序和插入排序
- 选择排序和插入排序
- 插入排序和选择排序
- 选择排序和插入排序
- 插入排序和选择排序
- 选择排序和插入排序
- 选择排序和插入排序
- 插入排序和选择排序
- 选择排序和插入排序
- 选择排序和插入排序
- 选择和插入排序
- 冒泡排序 选择排序和插入排序
- 冒泡排序、插入排序和选择排序
- 冒泡排序和插入排序,选择排序
- 插入排序,选择排序和快速排序
- tcp标志push与发送窗口的关系
- 如何用#define宏定义多行函数
- Ubuntu16.04 安装flash player
- SQL Server优化50法
- sql语句基础要点(以sql server 2008 为例)
- 选择排序和插入排序
- POJ 1734 Sightseeing trip【floyd求最小环+记录路径】
- Android 自定义view设置xml属性
- 虚拟机下破解CentOS root密码
- springmvc集成JSR-303的解析消息文件的默认实现浅析
- poj 3278 bfs 标记数组
- RxJava开发精要2-为什么是Observables?
- Android控件之RecyclerView的基本使用
- 【Github教程】史上最全github使用方法:github入门到精通