整理了一下常用的排序算法,算法过程和示意图不详细讲,百度很多,只列代码,如有错误,还望大家指出。

1.冒泡排序

public static void bubbleSort(int[] a){
for(int i=a.length-1;i>0;i--){
for(int j=0;j<i;j++){
if(a[j]>a[j+1]){
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
}

,冒泡排序的时间复杂度为O(n^2),是稳定的算法

2.快速排序

public static void quickSort(int[] a,int l,int r){
if(l<r){
int i,j,x;
i=l;
j=r;
x=a[i];
while(i<j){
while(i<j&&a[j]>x)
j--;
if(i<j)
a[i++]=a[j];
while(i<j&&a[i]<x)
i++;
if(i<j)
a[j--]=a[i];
}
a[i]=x;
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
}

快速排序的时间复杂度O(N*logN),不稳定算法

3.插入排序

public static void insertSort(int[] a){
int i,j,k;
for(i=1;i<a,length;i++){
for(j=i-1;j>=0;j--){
if(a[j]<a[i])
break;
}
if(j!=i-1){
int tmp=a[i];
for(k=i-1;k>j;k--)
a[k+1]=a[k];
a[k+1]=tmp;
}
}
}

插入排序的时间复杂度O(N^2),稳定的算法

4.希尔排序

public static void shellSort(int[] a){
for(int gap=a.length/2;gap>0;gap/=2){
for(int i=0;i<gap;i++){
for(int j=i+gap;j<a.length;j+=gap){
if(a[j]<a[j-gap]){
int tmp=a[j];
int k=j-gap;
while(k>=0&&a[k]>tmp){
a[k+gap]=a[k];
k-=gap;
}
a[k+gap]=tmp;
}
}
}
}
}

希尔排序的时间复杂度与gap有关,当增量为1时,蜕化成插入排序,此时的复杂度为O(N^2),而Hibbard增量的希尔排序的时间复杂度为O(N^3/2),不稳定算法

5.选择排序

public static void selectSort(int[] a){
int i,j,min;
for(i=0;i<a.length;i++){
min=i;
for(j=i+1;j<a.length;j++){
if(a[j]<a[min])
min=j;
}
if(min!=i){
int tmp=a[i];
a[i]=a[min];
a[min]=tmp;
}
}
}

选择排序的时间复杂度为O(N^2),稳定的算法

6.堆排序

//最大堆的向下调整算法
publi static void maxHeapDown(int[] a,int start,int end){
int c=start;
int l=2*c+1;
int tmp=a[c];
for(;l<=end;c=l,l=2*l+1){
if(l<end&&a[l]<a[l+1])
l++;
if(tmp>a[l])
break;
else{
a[c]=a[l];
a[l]=tmp;
}
}
}
//堆排从小到大
public static void heapSortAsc(int[] a,int n){
int i,tmp;
for(i=n/2-1;i>=0;i--)
maxHeapDown(a,i,n-1);
for(i=n-1;i>0;i--){
tmp=a[0];
a[0]=a[i];
a[i]=tmp;
maxHeapDown(a,0,i-1);
}
} //最小堆的向下调整算法
public static void minHeapDown(int[] a,int start,int end){
int c=start;
int l=2*c+1;
int tmp=a[c];
for(;i<=end;c=1,l=2*l+1){
if(l<end&&a[l]<a[l+1])
l++;
if(tmp<=a[l])
break;
else{
a[c]=a[l];
a[l]=tmp;
}
}
} //堆排序从大到小 public static void heapSortDesc(int[] a,int n){
int i,tmp;
for(i=n/2-1;i>=0;i--)
minHeapDown(a,0,n-1);
for(i=n-1;i>0;i--){
tmp=a[0];
a[0]=a[i];
a[i]=tmp;
minHeapDown(a,0,i-1);
}
}

堆排序的时间复杂度O(N*logN),不稳定算法

7.归并排序

public static void merge(int[] a,int start,int mid,int end){
int[] tm=new int[end-start+1];
int i=start;
int j=mid+1;
int k=0;
while(i<=mid&&j<=end){
if(a[i]<a[j])
tmp[k++]=a[i++];
elss
tmp[k++]=a[j++];
}
while(i<=mid)
tmp[k++]=a[i++];
while(j<=end)
tmp[k++]=a[j++];
for(i=0;i<k;i++)
a[start+i]=tmp[i]'
tmp=null;
}
//归并排序(由上往下) public static void mergeSortUp2Down(int[] a,int start,int end){
if(a==null||start>=end)
return;
int mid=start+(end-start)/2;
mergeSortUp2Down(a,start,mid);
mergeSortUp2Down(a,min+1,end);
merge(a,start,mid,end);
} //归并排序(从下往上)
public atatic void mergeDown2Up(int[] a){
if(a==null)
return;
for(int n=1;n<a.length;n*=2)
mergeGroup(a,a.length,n);
} public static void mergeGroups(int[] a,int len,int gap){
int i;
int twolen=2*gap;
for(i=0;i+2*gap-1<len;i+=(2*gap))
merge(a,i,i+gap-1,i+2*gap-1);
if(i+gap-1<len-1)
merge(a,i,i+gap-1,len-1);
}

归并排序的时间复杂度为O(N*logN),稳定的算法

8.桶排序

public static void bucketSort(int[] a,int max){
int[] buckets;
if(a==null||max<1)
return;
buckets=new int[max];
for(int i=0;i<a.length;i++){
buckets[a[i]]++;
}
for(int i=0,j=0;i<max;i++){
while((buckets[i]--)>0){
a[j++]=i;
}
}
buckets=null;
}

转自:http://wangkuiwu.github.io

感谢wangkuiwu大神

排序算法合集(Java)的更多相关文章

  1. 排序算法合集(C++实现)

    摘要 排序操作在程序设计中是非常基础和常见的,也是算法的基础部分,我对几种常见的比较排序算法进行了整理. 暴力排序(violence sort) 思想:遍历数组,每次遍历都在未排序的部分找到最小元素的 ...

  2. 常见算法合集[java源码+持续更新中...]

    一.引子 本文搜集从各种资源上搜集高频面试算法,慢慢填充...每个算法都亲测可运行,原理有注释.Talk is cheap,show me the code! 走你~ 二.常见算法 2.1 判断单向链 ...

  3. 排序算法合集 python

    直接选择.插入排序 直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的 ...

  4. 排序算法总结(基于Java实现)

    前言 下面会讲到一些简单的排序算法(均基于java实现),并给出实现和效率分析. 使用的基类如下: 注意:抽象函数应为public的,我就不改代码了 public abstract class Sor ...

  5. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  6. 八大排序算法总结与java实现(转)

    八大排序算法总结与Java实现 原文链接: 八大排序算法总结与java实现 - iTimeTraveler 概述 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 ...

  7. 第二章:排序算法 及其他 Java代码实现

    目录 第二章:排序算法 及其他 Java代码实现 插入排序 归并排序 选择排序算法 冒泡排序 查找算法 习题 2.3.7 第二章:排序算法 及其他 Java代码实现 --算法导论(Introducti ...

  8. 动画展现十大经典排序算法(附Java代码)

    0.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序: ...

  9. 排序算法代码实现-Java

    前言 为了准备面试,从2月开始将排序算法认认真真得刷了一遍,通过看书看视频,实践打代码,还有一部分的leetcode题,自己感觉也有点进步,将笔记记录总结发出来. 冒泡排序 该排序就是一种像泡泡浮到水 ...

随机推荐

  1. Spark Mllib里相似度度量(基于余弦相似度计算不同用户之间相似性)(图文详解)

    不多说,直接上干货! 常见的推荐算法 1.基于关系规则的推荐 2.基于内容的推荐 3.人口统计式的推荐 4.协调过滤式的推荐 协调过滤算法,是一种基于群体用户或者物品的典型推荐算法,也是目前常用的推荐 ...

  2. 2018护网杯-easy_laravel 复现

    题目docker环境: https://github.com/sco4x0/huwangbei2018_easy_laravel git clone下来直接composer up -d 运行即可,可以 ...

  3. 关于alibaba.fastjson的一些简单使用

    // 把JSON文本parse为JSONObject或者JSONArray public static final Object parse(String text); // 把JSON文本parse ...

  4. 面向对象设计与构造:JML规格单元作业总结

    面向对象设计与构造:JML规格单元作业总结 第一部分:JML语言理论基础 JML语言是什么:对Java程序进行规格化设计的一种表示语言 使用JML语言有什么好处: 用逻辑严格的规格取代自然语言,照顾马 ...

  5. webpack前端构建工具学习总结(二)之loader的使用

    Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换. Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为 ...

  6. shell脚本调试技巧

    shell脚本调试之工具——bashdb http://www.cnblogs.com/itcomputer/p/5011845.html

  7. 远程登录事件ID

    4672.4624 删除本机记录 HKEY_CURRENT_USER \ Software\Microsoft  \ Terminal ServerClientDefault: 删除“此电脑\文档”下 ...

  8. django建议入门-FYI

    django 简易博客 现在正式开始博客开发 1安装官方发布版 官方发布的版本带有一个版本号,例如1.0.3或1.1,而最新版本总是可以在http://www.djangoproject.com/do ...

  9. UVA 10375 Choose and divide(大数的表示)

    紫上给得比较奇怪,其实没有必要用唯一分解定理.我觉得这道题用唯一分解只是为了表示大数. 但是分解得到的幂,累乘的时候如果顺序很奇怪也可能溢出.其实直接边乘边除就好了.因为答案保证不会溢出, 设定一个精 ...

  10. 项目开发中dev、test和prod是什么意思

    开发环境(dev):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意,为了开发调试方便,一般打开全部错误报告. 测试环境(test):一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常 ...