目录:

  1、冒泡排序(Bubble Sort)

  2、选择排序(Selection Sort)

  3、插入排序(Insertion Sort)

  4、希尔排序(Shell Sort)

  5、归并排序(Merge Sort)

  6、快速排序(Quick Sort)

  7、堆排序(Heap Sort)

  8、计数排序(Counting Sort)

  9、桶排序(Bucket Sort)

  10、基数排序(Radix Sort)

1、冒泡排序(Bubble Sort)

 

1、基本思想:两个数比较大小,较大的数下沉,较小的数冒起来。

2、算法描述:

比较相邻的元素。如果第一个比第二个大,就交换它们两个;
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
针对所有的元素重复以上的步骤,除了最后一个;
重复步骤1~3,直到排序完成。
3、实现列子: 

public static void main(String[] args) {
  int [] array={1,20,11,90,50,2000,39};
  int steam;
  boolean flase;
  for(int i=0;i<array.length-1;i++){
    flase=false;
    for (int j=array.length-1; j>i; j--) {
    if(array[j]<array[j-1]){
      steam=array[j];
      array[j]=array[j-1];
      array[j-1]=steam;
      flase=true;
    }
  }
  if(!flase) break;
  }
  System.out.println(Arrays.toString(array));
}

2、选择排序(Selection Sort)

1、动态图

2、

表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

2.1 算法描述

n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:

  • 初始状态:无序区为R[1..n],有序区为空;
  • 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • n-1趟结束,数组有序化了。

3、实现列子:

public static void main(String[] args) {
  int[] array = { 11, 1, 22, 33, 55, 44, 3 };
  for (int i = 0; i < array.length; i++) { //加入获取的第一个数字就是最小的开始与第二个数字进行比较
    int min = i;

  for (int j = i + 1; j < array.length; j++) {//从第二个数字开始往后循环比较
    if (array[j] < array[min]) {
      min = j;
    }
  }
  SelectionSort.swap(array, i,min);
}
  System.out.println(Arrays.toString(array));
}

  private static void swap(int[] arr, int i, int j) {//比较值根据下表去相互替换
    int temp = arr[i];//这是需要变更的下标值
    arr[i] = arr[j];
    arr[j] = temp;
  }

3、插入排序(Insertion Sort)

1、动态图:

2、算法思想:

在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

3:列子:

Integer[] number = NumberUtil.getNumber(100000,1,100000);
  long start=System.currentTimeMillis();
  for (int i = 0; i < number.length - 1; i++) {
    int current = number[i + 1];
    int preIndex = i;
  while (preIndex >= 0 && current < number[preIndex]) {
    number[preIndex + 1] = number[preIndex];
    preIndex--;
  }
  number[preIndex + 1] = current;
}
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start));
System.out.println(Arrays.toString(number));

4工具方法:

public static Integer[] getNumber(int n,int startNum,int endNum){
  Integer [] val=new Integer[n];
  for(int i=0;i<n;i++){
    val[i]=new Integer((int)(Math.random()*(endNum-startNum))+startNum);
  }
  return val;
}

4、希尔排序(Shell Sort)

1、动态图

2、算法思想:

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。

3、实现列子:

public static void main(String[] args) {
  int[] array = { 11, 1, 22, 33, 55, 44, 3 };
  int arr1=array.length;
  int index1,index2=arr1/2;
    while (index2>0) {
      for (int i = index2; i < arr1; i++) {
        index1=array[i];
        int preIndex =i-index2;
          while (preIndex>=0&&array[preIndex]>index1) {

            array[preIndex + index2] = array[preIndex];
            preIndex -= index2;
          }
      array[preIndex + index2] = index1;
      }
    index2 /= 2;
    }
  System.out.println(Arrays.toString(array));
}

5、归并排序(Merge Sort)

1、动态图:

2、基本思想:

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序;
  • 将两个排序好的子序列合并成一个最终的排序序列

3、实现列子:

  Arrays.copyOfRange(array, 0, mid);

  1. 第一个参数表示源数组
  2. 第二个参数表示开始位置(取得到)
  3. 第三个参数表示结束位置(取不到)

public static void main(String[] args) {
  int[] array = { 11, 1, 22, 33, 55, 44, 3 };
  int[] sort2 = sort(array);
  System.out.println(Arrays.toString(sort2));
}

private static int[] sort(int [] array) {
// TODO Auto-generated method stub
  if(array.length<2){
    return array;
  }
  int mid = array.length / 2;
  int[] left = Arrays.copyOfRange(array, 0, mid);
  int[] right = Arrays.copyOfRange(array, mid, array.length);
  return merge(sort(left), sort(right));

}

public static int[] merge(int[] left, int[] right) {
  int[] result = new int[left.length + right.length];
  for (int index = 0, i = 0, j = 0; index < result.length; index++) {
  if (i >= left.length)
    result[index] = right[j++];
    else if (j >= right.length)
    result[index] = left[i++];
    else if (left[i] > right[j])
    result[index] = right[j++];
    else
    result[index] = left[i++];
}
  return result;
}

Java 十大排序算法的更多相关文章

  1. 十大排序算法总结(Python3实现)

    十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...

  2. Algorithm --> 十大排序算法

    十大排序算法 主要排序法有:  一.冒泡( Bubble)排序—— 相邻交换  二.选择排序 ——每次最小/ 大排在相应的位置  三.插入排序 ——将下一个插入已排好的序列中  四.壳( Shell) ...

  3. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html

  4. 十大排序算法JavaScript实现总结

    花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...

  5. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  6. 使用 js 实现十大排序算法: 快速排序

    使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...

  7. 使用 js 实现十大排序算法: 桶排序

    使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. 使用 js 实现十大排序算法: 计数排序

    使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  9. 使用 js 实现十大排序算法: 基数排序

    使用 js 实现十大排序算法: 基数排序 基数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

随机推荐

  1. 【翻译】Flink Table Api & SQL — 用户定义函数

    本文翻译自官网:User-defined Functions  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/tabl ...

  2. Js限制Input框只能输入数字

    <input type="text" onkeyup="value=value.replace(/[^\d]/g,'')" /> <input ...

  3. 画图前端:mermaid。时序图/类图/甘特图/流程图/状态图/饼图。类似工具:Typora

    文档 https://mermaidjs.github.io/#/ cdn https://www.bootcdn.cn/mermaid/ 在线编辑 https://mermaidjs.github. ...

  4. 【视频开发】关于FFMPEG中内存泄漏的问题之av_bitstream_filter_filter

    How may I free pkt in an ffmpeg write frame method Rate this:      See more: C++ ffmpeg Greetings I' ...

  5. Apollo环境配置

    一.背景 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...

  6. NOI2019 Fe

    NFLS XY NOI2019 Fe Orz zsy,zhf,wqy,zjc,bly! Goodbye OI!

  7. LeetCode 103. 二叉树的锯齿形层次遍历(Binary Tree Zigzag Level Order Traversal)

    103. 二叉树的锯齿形层次遍历 103. Binary Tree Zigzag Level Order Traversal 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再 ...

  8. 【C++札记】函数重载

    概述 函数重载指在相同作用域中多个函数名相同,函数的形参不同. 遵循规则: 1.函数名相同 2.函数的参数,类型,个数或顺序不一样都可以构成重载. 3.函数返回值得类型不同不构成重载,编译直接报错,存 ...

  9. 2019-10-11 ubuntu ssh远程免密登录配置及配置别名

    在客户端能正常远程访问服务端的前提下. 客户端: 1)配置免密 执行 ssh-keygen 即可生成 SSH 钥匙,回车三次. 执行 ssh-copy-id user@remote,可以让远程服务器记 ...

  10. Centos 7 添加开机启动

    1.添加启动服务 添加docker开机启动服务 [root@localhost ~]# systemctl enable docker.serviceCreated symlink from /etc ...