内部排序比较(Java版)
内部排序比较(Java版)
2017-06-21
目录
1 三种基本排序算法
1.1 插入排序
1.2 交换排序(冒泡)
1.3 选择排序(简单)
2 比较
3 补充
3.1 快速排序
3.2 什么是桶排序
3.3 堆排序
1 三种基本排序算法
1.1 插入排序
public static void InsertSort(int[] arrs) {
int j;
int tmp;
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) {
int tmp;
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) {
int minIndex;
int tmp;
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 class QuickSort
{
public static void main(String[] args)
{
int[] arr=new int[]{1,5,2,3,6,8,4,9,7,5};
QuickSort quickSort=new QuickSort(arr);
quickSort.sort();
quickSort.print();
} private int[] arr;
public QuickSort(int[] arr)
{
this.arr=arr;
} public void sort()
{
quickSort(arr,0,arr.length-1);
} public void quickSort(int[] arr,int begin,int end)
{
if(begin<end)
{
int i = partition(arr, begin, end);
quickSort(arr,begin,i-1);
quickSort(arr,i+1,end);
}
} private int partition(int[] arr, int begin, int end) {
int key=arr[begin];
while(begin<end)
{
while (begin<end&&arr[end]>=key)end--;
if(begin<end) {
arr[begin] = arr[end];
}
while(begin<end&&arr[begin]<=key)begin++;
if(begin<end) {
arr[end] = arr[begin];
}
}
arr[begin]=key;
return begin;
} public void print()
{
for(int value:arr)
System.out.println(value);
}
}
3.2 什么是桶排序
桶排序,也叫作箱排序,是一个排序算法,也是所有排序算法中最快、最简单的排序算法。其中的思想是我们首先需要知道所有待排序元素的范围,然后需要有在这个范围内的同样数量的桶,接着把元素放到对应的桶中,最后按顺序输出。
- 时间复杂度为O(n+m)
- 空间复杂度是O(m),其中m为桶的个数,
/**
* 桶排序,也叫作箱排序,是一个排序算法,也是所有排序算法中最快、最简单的排序算法。
* 其中的思想是我们首先需要知道所有待排序元素的范围,然后需要有在这个范围内的同样数量的桶,接着把元素放到对应的桶中,最后按顺序输出。
* 由于时间复杂度为O(n+m),m为桶容量,如果m比n大太多,则从时间上来说,性能也并不是很好。
*/
public class BucketSort {
public static void main(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 void sort()
{
if(array!=null&&array.length!=0)
{
for(int i=0;i<array.length;i++)
{
buckets[array[i]]++;
}
}
} public void print()
{
for(int i=0;i<buckets.length;i++)
{
for(int j=buckets[i];j>0;j--)
System.out.println(i);
}
}
}
3.3 堆排序
堆的定义

我们可以吧这个序列看成一个二叉树,可得, 1)最大堆的根节点最大,2)上层总比下层大
- 时间复杂度是O(logn)
public class HeapSort {
public static void main(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, int index) {
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<array.length;i=i*2)
{
for(int k=i-1;k<2*(i)-1&&k<array.length;k++)
{
System.out.print(array[k]+" ");
}
System.out.println();
}
}
public static void exchangeElements(int[] array, int index1, int index2) {
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
内部排序比较(Java版)的更多相关文章
- 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题
常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...
- 常见的链表排序(Java版)
上篇博客中讲解了九大内部排序算法,部分算法还提供了代码实现,但是那些代码实现都是基于数组进行排序的,本篇博客就以链表排序实现几种常见的排序算法,以飨读者. 快速排序的链表实现 算法思想:对于一个链表, ...
- 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...
- 常用排序算法--java版
package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...
- 高速排序(Java版)
package com.love.test; import java.util.Scanner; /** * @author huowolf *高速排序实现 *快排是十分优秀的排序算法. *核心:分治 ...
- 打乱式排序的Java版实现
项目中涉及到对大批量的数据进行打乱式排序,大概原理如下: 输入源数据:1,1,2,3,3,3,4,4 输出结果: 1,2,3,4,1,3,4,3 实现代码如下,采用递归的思想: static &l ...
- 排序算法Java版
选择排序: public static void selectSort(int[]a) { int minIndex=0; int temp=0; if((a==null)||(a.length==0 ...
- 排序小结(java版)
一.归并排序 package org.lxh.demo08.b; class Sort { private int[] a; private int n; Sort(int n) { a=new in ...
- 选择排序(java版)
public class SelectSortTest { public static void selectSort(int[] source) { for (int i = 0; i < s ...
- 常见排序算法总结(java版)
一.冒泡排序 1.原理:相邻元素两两比较,大的往后放.第一次完毕,最大值在最大索引处. 即使用相邻的两个元素一次比价,依次将最大的数放到最后. 2.代码: public static void bub ...
随机推荐
- nRF2401A/nRF24L01/nRF24L01+无线模块最常见问题汇集(转)
俗话说:每个人一生下来什么都会的,都是通过自己努力和探索出来的,NRF系列芯片,刚开始都好奇心加兴趣才来捣鼓它的,刚开始做硬件和软件,没有收发数据弄得整个人头都快炸开了,所以在此和大家分享一下前辈的经 ...
- SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)
SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART( ...
- eclipse安装activiti designer
方法一:在线安装(可能因网络等原因安装失败) 打开eclipse,在Help->Install New Software后的弹出窗点击add按钮. 在弹出窗口的文本框里输入一下内容 Name: ...
- 我的Android之旅——学习、项目、心态
本文作者: 伯乐在线 - 唐韧 .未经许可,禁止转载!欢迎分享原创到伯乐头条. 来源:唐韧 学习Android也一年多了,项目做了五六个,有大有小,有难有易.一直以来都没有好好总结过,今天周六休息,就 ...
- xcode9报错 Safe Area Layout Guide before iOS9.0
运行工程的时候会遇到 Safe Area Layout Guide before iOS9.0 这是因为xcode9 storyboard的设置里面多了 个 Safe Area Layout Gu ...
- windows开机后键盘失灵(非硬件原因)解决办法
今天来了,开机时突然发现输入密码时,键盘不管用了,试了一下键盘没问题,插口也没问题,能进入安全模式,很奇怪,昨天好好的今天却不能用了,找人倒腾了大半天也没搞出来,后来用PE盘消掉了密码,总算进入了系统 ...
- Redis 的安装与使用(单节点)
Redis 的安装与使用(单节点) 环境:CentOS 6.5 Redis 版本:redis-3.0 (考虑到Redis3.0 在集群和性能提升方面的特性,rc 版为正式版的候选版,而且 很快就出 ...
- SharePoint 2013 How to Backup Site Collection Automatically With a PowerShell Script
In this post I will introduce a way how to run a script for backing up SharePoint data which could b ...
- Android ListView and Tips.
Tips: ListView嵌套ListView,有footerView时.须要又一次measure高度时,footerview最顶层的view不能是RelativeLayout,最好用LinearL ...
- CUDA 中的计时方法
问题描述:一般利用CUDA进行加速处理时,都需要测试CUDA程序的运行时间,来对比得到的加速效果. 解决方法: 1).GPU端计时,即设备端计时. 2).CPU端计时,即主机端计时. 设备端计时有两种 ...