内部排序比较(Java版)

2017-06-21

目录

1 三种基本排序算法

1.1 插入排序

public static void InsertSort(int[] arrs) {intj;inttmp;for (int i = 1; i < arrs.length; i++) {

tmp=arrs[i];for (j = i - 1; j >= 0 && tmp < arrs[j]; j--) {

arrs[j+ 1] =arrs[j];

}

arrs[j+ 1] =tmp;

}

}

1.2 交换排序(冒泡)

public static void BubbleSortS(int[] arrs) {inttmp;for (int i = arrs.length - 1; i > 0; i--) {for (int j = 0; j < i; j++) {if (arrs[j] > arrs[j + 1]) {

tmp=arrs[j];

arrs[j]= arrs[j + 1];

arrs[j+ 1] =tmp;

}

}

}

}

1.3 选择排序(简单)

public static void SelectSort(int[] arrs) {intminIndex;inttmp;for (int i = 0; i < arrs.length - 1; i++) {

minIndex=i;for (int j = i + 1; j < arrs.length; j++) {if (arrs[minIndex] >arrs[j])

minIndex=j;

}if (minIndex !=i) {

tmp=arrs[minIndex];

arrs[minIndex]=arrs[i];

arrs[i]=tmp;

}

}

}

2 比较

排序方法

复杂度

辅助空间

内外循环

一次内循环取最大数

一次循环交换次数

插入排序

O(n2)

1

i=1->length-1

j=i-1->0

O(1)

冒泡排序

O(n2)

1

i=length-1->1

j=0->i-1

O(n)

选择排序

O(n2)

2

i=0->length-1

j=i+1->length-1

O(1)

内部排序(C#)

3 补充

3.1 快速排序

快速排序是对冒泡排序的一种改进。

时间复杂度,最坏是O(n2),一般O(nlogn),

空间复杂度(递归实现),在一般情况下的空间复杂度为O(logn),在最差的情况下,若每次只完成了一个元素,那么空间复杂度为O(n)

/*** 快速排序是在冒泡排序的基础上改进而来的,冒泡排序每次只能交换相邻的两个元素,而快速排序是跳跃式的交换,交换的距离很大,因此总的比较和交换次数少了很多,速度也快了不少。

* 时间复杂度,最坏是O(n2),一般O(nlogn)*/

public classQuickSort

{public static voidmain(String[] args)

{int[] arr=new int[]{1,5,2,3,6,8,4,9,7,5};

QuickSort quickSort=newQuickSort(arr);

quickSort.sort();

quickSort.print();

}private int[] arr;public QuickSort(int[] arr)

{this.arr=arr;

}public voidsort()

{

quickSort(arr,0,arr.length-1);

}public void quickSort(int[] arr,int begin,intend)

{if(begin

{int i =partition(arr, begin, end);

quickSort(arr,begin,i-1);

quickSort(arr,i+1,end);

}

}private int partition(int[] arr, int begin, intend) {int key=arr[begin];while(begin

{while (begin=key)end--;if(begin

arr[begin]=arr[end];

}while(begin

arr[end]=arr[begin];

}

}

arr[begin]=key;returnbegin;

}public voidprint()

{for(intvalue:arr)

System.out.println(value);

}

}

View Code

3.2 什么是桶排序

桶排序,也叫作箱排序,是一个排序算法,也是所有排序算法中最快、最简单的排序算法。其中的思想是我们首先需要知道所有待排序元素的范围,然后需要有在这个范围内的同样数量的桶,接着把元素放到对应的桶中,最后按顺序输出。

时间复杂度为O(n+m)

空间复杂度是O(m),其中m为桶的个数,

/*** 桶排序,也叫作箱排序,是一个排序算法,也是所有排序算法中最快、最简单的排序算法。

* 其中的思想是我们首先需要知道所有待排序元素的范围,然后需要有在这个范围内的同样数量的桶,接着把元素放到对应的桶中,最后按顺序输出。

* 由于时间复杂度为O(n+m),m为桶容量,如果m比n大太多,则从时间上来说,性能也并不是很好。*/

public classBucketSort {public static voidmain(String[] args)

{int[] needSortedArr=new int[]{9,2,3,0,3};

BucketSort bucketSort=new BucketSort(10,needSortedArr);

bucketSort.sort();

bucketSort.print();

}private int[] buckets;private int[] array;public BucketSort(int range,int[] array)

{this.buckets=new int[range];this.array=array;

}public voidsort()

{if(array!=null&&array.length!=0)

{for(int i=0;i

{

buckets[array[i]]++;

}

}

}public voidprint()

{for(int i=0;i

{for(int j=buckets[i];j>0;j--)

System.out.println(i);

}

}

}

View Code

3.3 堆排序

堆的定义

我们可以吧这个序列看成一个二叉树,可得, 1)最大堆的根节点最大,2)上层总比下层大

时间复杂度是O(logn)

public classHeapSort {public static voidmain(String[] args) {int[] array = { 8, 6, 9, 7, 5, 4, -3, -2, -1, 0, 1, 2, 3};

System.out.println("Before heap:");

printArray(array);

printHeapTree(array);

System.out.println("build max heap:");

buildMaxHeap(array);

printArray(array);

printHeapTree(array);

heapSort(array);

System.out.println("After heap sort:");

printArray(array);

printHeapTree(array);

}public static void heapSort(int[] array) {if (array == null || array.length <= 1) {return;

}//建大顶堆

buildMaxHeap(array);//堆排序

for (int i = array.length - 1; i >= 1; i--) {

exchangeElements(array,0, i);

maxHeap(array, i,0);

}

}private static void buildMaxHeap(int[] array) {if (array == null || array.length <= 1) {return;

}int half = array.length / 2-1;for (int i = half; i >= 0; i--) {

maxHeap(array, array.length, i);

}

}//时间复杂度O(logN)

private static void maxHeap(int[] array, int heapSize, intindex) {int left = index * 2 + 1;int right = index * 2 + 2;int largest =index;if (left < heapSize && array[left] >array[index]) {

largest=left;

}if (right < heapSize && array[right] >array[largest]) {

largest=right;

}if (index !=largest) {

exchangeElements(array, index, largest);

maxHeap(array, heapSize, largest);

}

}public static void printArray(int[] array) {

System.out.print("{");for (int i = 0; i < array.length; i++) {

System.out.print(array[i]);if (i < array.length - 1) {

System.out.print(", ");

}

}

System.out.println("}");

}private static void printHeapTree(int[] array)

{for(int i=1;i

{for(int k=i-1;k<2*(i)-1&&k

{

System.out.print(array[k]+" ");

}

System.out.println();

}

}public static void exchangeElements(int[] array, int index1, intindex2) {int temp =array[index1];

array[index1]=array[index2];

array[index2]=temp;

}

}

View Code

java内置排序有哪些_内部排序比较(Java版)相关推荐

  1. python-DRF_限流Throttling_自定义频率类_内置频率类使用_过滤排序功能

    DRF-Django rest framework 认证权限频率 1. 限流Throttling 可以对接口访问的频次进行限制,以减轻服务器压力 一般用于付费购买次数,投票等场景使用 1. 自定义频率 ...

  2. Java内置队列和高性能队列Disruptor

    一.队列简介 队列是一种特殊的线性表,遵循先入先出.后入后出(FIFO)的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是java的某些队列运行在任何地方插入删除:比 ...

  3. java dump分析工具_Java 性能分析工具 (2):Java 内置监控工具

    引言 本文为 Java 性能分析工具系列文章第二篇,第一篇:操作系统工具.在本文中将介绍如何使用 Java 内置监控工具更加深入的了解 Java 应用程序和 JVM 本身.在 JDK 中有许多内置的工 ...

  4. 为什么阿里Java规约禁止使用Java内置Executors创建线程池?

    IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒. 告诉你手动创建线程池,效果会更好. 在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有 ...

  5. 自定义线程池-java内置线程池构造方法介绍

    Java内置线程池原理剖析 我们要想自定义线程池,必须先了解线程池的工作原理,才能自己定义线程池:这里我们通过观察java中ThreadPoolExecutor的源码来学习线程池的原理; Thread ...

  6. 不使用java内置函数,将String字符串转换为int类型

    package com.test;public class AtoiTest {public static void main(String[] args) throws Exception {Str ...

  7. JAVA内置注解 基本注解

    温故而知新,可以为师矣! 每天复习,或者学习一点小东西,也能水滴石穿! 今天复习5个JAVA内置基本注解(贴代码胜过千言万语): package com.lf.test;import java.uti ...

  8. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  9. Java内置线程池ExecutorService介绍及商品秒杀案例

    第一.ExecutorService接口是java内置的线程池接口,通过学习接口中的方法,可以快速的掌握java内置线程池的基本使用 常用方法: void shutdown() 启动一次顺序关闭,执行 ...

最新文章

  1. [转] Android开发之如何保证Service不被杀掉(broadcast+system/app)
  2. Android IOS WebRTC 音视频开发总结(三八)-- tx help
  3. docker容器 cpu memory 资源限制
  4. 【00】设计模式概要
  5. Tableau必知必会之如何做嵌套组合饼图
  6. 2021-01-21 linux shell脚本实现间隔一定时间执行一次任务
  7. ora-03115:不支持的网络数据类型 oracle,Oracle10g新增DBMS_FILE_TRANSFER包(二)
  8. 微软开源基于 Envoy 的服务网格 Open Service Mesh
  9. 分析Java核心转储
  10. PHP中英文截取函数,php字符串截取函数,支持中英文混体
  11. 啥?!BM25 比语义向量检索效果好?
  12. codeforces731E Funny Game(DP)
  13. 网络战争阴影临近,伊朗核设施受攻击
  14. python 根据字符串语句进行操作再造函数(evec和eval方法)
  15. DSP程序死机(跑飞)的一些情况-硬件原因
  16. java代码上传到私服,maven上传源码到私服(示例代码)
  17. USB Server应用于前置机案例分析
  18. [歌词生成] 基于LSTM语言模型和seq2seq序列模型:数据爬取、模型思想、网络搭建、歌词生成
  19. 常用 XML 解析技术
  20. 自定义UpsertStreamTableSink

热门文章

  1. DBATools PowerShell SQL Server数据库备份命令
  2. 第八章 JQuery操作DOM
  3. Python3 找不到库
  4. 【C#复习总结】细说表达式树
  5. Only a type can be imported. xxxx resolves to a package
  6. CentOS7.2安装Oracle12.1.0.2
  7. 对软件工程的问题及个别软件的分析
  8. mysql5.7 java读取乱码
  9. MS-SQL中创建索引
  10. 调整Linux磁盘分区大小