目录:

  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. 自定义Shell分隔符

    在shell中使用for循环语句时,参数列表有时候需要将空格纳入参数当中,这时就不好使用空格作为分隔符.如下例中,我实际想要输出的是a1.a2.b1.b2以及hello world,但却输出了如下内容 ...

  2. Docker容器(六)——创建docker私有化仓库

    docker私有化仓库是为了节约带宽(外网速度慢或者干脆不能连外网),以及自己定制系统. (1).环境 youxi1 192.168.5.101 docker私有化仓库 youxi2 192.168. ...

  3. python 中requests的返回数可直接使用json

    对Python的request不是很了解,在使用时才发现,可以把request的请求结果,直接使用.json()['字段名']方法进行一个取值,案例如下 def test_tiantian(self) ...

  4. Linux开机报错,提示根目录有错误,无法通过检测进入系统

    报错信息如下: VolGroup-lv_root contains a file system with errors, check forced. 修复方法:(因为我的是虚拟机,可以随意做备份,所以 ...

  5. Spring boot使用Aspose.Slides操作ppt转PDF、转图片

    最近要将ppt转为PDF和图片,Apache poi ,jacob都试了下 Apache poi 转图片乱码,处理了,还会存在部分乱码 jacob对系统依赖比较大,必须是windows还得安装MS O ...

  6. 【视频开发】【Live555】摄像头采集,264编码,live555直播(0)

    参看 有关live555 1.首先需要修改live555,定义从 内存中直接获取source而不是从文件读取source的类. 自己实现的类命名为 H264FramedLiveSource   /* ...

  7. POJ 1014 Dividing(入门例题一)

    Time Limit: 1000MS Memory Limit: 10000K Total Submissions: Accepted: Description Marsha and Bill own ...

  8. ProtoStuff无法反序列化Deprecated注解成员问题记录

    在开发过程中,遇到一个鬼畜的问题,在DO的某个成员上添加@Deprecated注解之后,通过ProtoStuff反序列化得到的DO中,这个成员一直为null:花了不少时间才定位这个问题,特此记录一下 ...

  9. php_mvc实现步骤六

    shop34-1-目录布局 存在项目的根目录 shop34 框架代码与应用程序代码划分 框架代码: 在各个应用程序间可以通用的代码. 应用程序代码: 当前项目的业务逻辑实现的代码. 分别创建两个子目录 ...

  10. LeetCode 946. 验证栈序列(Validate Stack Sequences) 26

    946. 验证栈序列 946. Validate Stack Sequences 题目描述 Given two sequences pushed and popped with distinct va ...