八种常见的排序算法

八种算法分为五大类

1. 交换排序
冒泡排序
快速排序
2. 插入排序
直接插入排序
希尔排序
3. 选择排序
简单选择排序
堆排序
5. 归并排序
6. 基数排序

1. 冒泡排序

import java.util.Arrays;public class BubleSort {public static void main(String args[]) {int[] arr = new int[]{5, 2, 4, 3, 9, 0, 6, 1};bublesort(arr);System.out.print(Arrays.toString(arr));}public static void bublesort(int[] A) {int n = A.length;for (int i = 0; i < n; i++) {for (int j = 0; j < n - i - 1; j++) {if(A[j] > A[j +1]) {int tmp = A[j];A[j] = A[j + 1];A[j + 1] = tmp;}}}}
}

2. 快速排序

import java.util.Arrays;public class QuickSort {public static void  main(String args[]) {int[] a = new int[] {2, 5, 1, 3, 9, 0 ,6, 7};quicksort(a, 0, a.length - 1);System.out.print(Arrays.toString(a));}public static void quicksort(int[] arr, int start, int end) {// 递归条件if (start < end) {int pivot = arr[start];int low = start;int high = end;while(low < high) {// 右边的数字比标准大while(low < high && arr[high] >= pivot) {high--;}arr[low] = arr[high];while (low < high && arr[low] <= pivot) {low++;}arr[high] = arr[low];}arr[low] = pivot;quicksort(arr, start, low);quicksort(arr, low+1, end);}}
}

3. 直接插入排序

import java.util.Arrays;public class InsertSort {public static void  main(String args[]) {int[] a = new int[] {2, 1, 5, 3, 9, 0 ,6, 7};insertsort(a);System.out.print(Arrays.toString(a));}public static void insertsort(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {if(arr[i] < arr[i - 1]){int tmp = arr[i];int j = i;while(j >= 1 && tmp < arr[j - 1]) {arr[j] = arr[j - 1];j--;}arr[j] = tmp;}}}
}

4. 希尔排序

希尔排序其实就是解决了直接插入排序问题:如果在已经拍好的序列很长了,这时候需要插入一个特别小的数字,效率将会变得很低

import java.util.Arrays;public class ShellSort {public static void  main(String args[]) {int[] a = new int[] {2, 1, 5, 3, 9, 0 ,6, 7};shellsort(a);System.out.print(Arrays.toString(a));}public static void shellsort(int[] arr) {int n = arr.length;// 遍历所有的步长for (int d = n / 2; d > 0; d /= 2) {// 遍历所有的元素for (int i = d; i < n; i ++) {//遍历本组中所有元素for (int j = i - d; j >= 0 ; j -= d) {if(arr[j] > arr[j + d]){int tmp = arr[j];arr[j] = arr[j + d];arr[j + d] = tmp;}}}}}
}

5. 简单选择排序

import java.util.Arrays;public class SelectSort {public static void main(String args[]) {int[] a = new int[] {0, 2, 5, 3, 9, 1 ,6, 7};selectsort(a);System.out.print(Arrays.toString(a));}private static void selectsort(int[] a) {int n = a.length;for (int i = 0; i < n; i++) {int minIndex = i;int min = a[i];for (int j = i + 1; j < n; j++) {if(a[j] < a[minIndex]) {minIndex = j;}}if (minIndex != i) {int tmp = a[i];a[i] = a[minIndex];a[minIndex] = tmp;}}}
}

6. 归并排序

import java.util.Arrays;public class MergeSort {public static void main(String args[]) {int[] a = new int[] {1, 3, 5, 2, 4, 6, 8, 10};mergesort(a, 0,a.length - 1);System.out.print(Arrays.toString(a));}public static void mergesort(int[] a, int low, int high) {int mid = (high + low) / 2;
//    if(mid != low){      mergesort(a, low, mid);
    }
    if(mid != high){      mergesort(a, mid+1, high);
    }
    merge(a, low, mid, high);if(low < high) {mergesort(a, low, mid);mergesort(a, mid+1, high);merge(a, low, mid, high);}}public static void merge(int[] a, int low, int mid, int high) {int[] tmp = new int[high - low + 1];int i = low;int j = mid + 1;int index = 0;while(i <= mid && j <= high) {if(a[i] <= a[j]) {tmp[index] = a[i];i++;}else {tmp[index] = a[j];j++;}index++;}while(i <= mid) {tmp[index] = a[i];i++;index++;}while(j <= high){tmp[index] = a[j];j++;index++;}for (int k = 0; k < tmp.length; k++) {a[low + k] = tmp[k];}}}

7. 基数排序

适用于大的小的都有的 位数也不同 差别很大

import java.util.Arrays;public class RadisSort {public static void main(String args[]) {int[] a = new int[] {342, 27, 5, 13, 46, 69, 807, 10, 2};radissort(a);System.out.print(Arrays.toString(a));}private static void radissort(int[] a) {// 先找出数组中最大数字,用于确定有多少位int max = Integer.MIN_VALUE;for (int i = 0; i < a.length; i++) {max = max > a[i] ? max : a[i];}// 求最大数字的位数,用于后面确定循环多少次int maxLen = (max +"").length();int[][] tmp = new int[10][a.length];int[] counts = new int[10];for (int i = 0, n = 1; i < maxLen; i++,n *= 10) {// 把所有的数按照该轮次放到不同的桶里for (int j = 0; j < a.length; j++) {int ys = a[j]/n % 10;tmp[ys][counts[ys]] = a[j];counts[ys]++;}// 从桶里取出int cnt = 0;for (int l = 0; l < 10; l++) {if(counts[l] != 0) {for(int k = 0; k < counts[l]; k++) {a[cnt] = tmp[l][k];cnt ++;}}}// 计数器全部归0for (int m = 0; m < 10; m++) {counts[m] = 0;}}}
}

基数排序的优化(使用队列来实现)

import java.util.Arrays;
import lanqiao.MyQueue;public class RadisQuickSort {public static void main(String args[]) {int[] a = new int[] {342, 27, 5, 13, 46, 69, 807, 10, 2};radissort(a);System.out.print(Arrays.toString(a));}private static void radissort(int[] a) {// 先找出数组中最大数字,用于确定有多少位int max = Integer.MIN_VALUE;for (int i = 0; i < a.length; i++) {max = max > a[i] ? max : a[i];}// 求最大数字的位数,用于后面确定循环多少次int maxLen = (max +"").length();// 这里改成了队列MyQueue[] tmp = new MyQueue[10];for (int i = 0; i < 10; i++) {tmp[i] = new MyQueue();}
//    int[][] tmp = new int[10][a.length];
//    int[] counts = new int[10];for (int i = 0, n = 1; i < maxLen; i++,n *= 10) {// 把所有的数按照该轮次放到不同的桶里for (int j = 0; j < a.length; j++) {// 计算余数int ys = a[j]/n % 10;// 这里相当于入队tmp[ys].add(a[j]);
//        tmp[ys][counts[ys]] = a[j];
//        counts[ys]++;}// 从桶里取出int cnt = 0;for (int l = 0; l < 10; l++) {// 循环出队while(!tmp[l].isEmpty()) {a[cnt] = tmp[l].poll();cnt++;}
//        if(counts[l] != 0) {//          for(int k = 0; k < counts[l]; k++) {//            a[cnt] = tmp[l][k];
//            cnt ++;
//          }
//        }}
//      // 计数器全部归0
//      for (int m = 0; m < 10; m++) {//        counts[m] = 0;
//      }}}
}

java数据结构与算法基础(二)-排序相关推荐

  1. java算法概述,Java数据结构与算法基础(一)概述与线性结构

    Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...

  2. 【Java面试高频问题】Java数据结构和算法基础知识汇总

    文章目录 Java数据结构和算法基础知识 一.Java数据结构 1. 线性结构:数组.队列.链表和栈 1.1 数组(Array) 1.2 稀疏数组 1.3 队列(Queue) 1.4 链表(Linke ...

  3. Java数据结构与算法(二)

    Java数据结构与算法(二) 第六章 递归 1 递归应用场景 2 递归的概念 3 递归调用机制 4 递归能解决什么样的问题 5 递归需要遵守的重要规则 6 递归-迷宫问题 6.1 迷宫问题 6.2 代 ...

  4. Java数据结构和算法(二)——数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖--数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

  5. Java数据结构和算法(二):数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖--数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

  6. Java数据结构与算法(六) 希尔排序

    ###一.希尔排序的产生 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提 ...

  7. Java数据结构与算法解析(二)——栈

    栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶.对栈的基本操作有push(进栈)和pop(出栈),对空栈进行push和pop,一般被认为栈ADT的一个错误.当push时空间用尽 ...

  8. 【笔记】Java数据结构与算法

    [笔记]Java数据结构与算法 文章目录 [笔记]Java数据结构与算法 1.八大排序应用场景 2.未完待续-- 1.八大排序应用场景 冒泡排序:优化后的冒泡排序可用于当数据已经基本有序,且数据量较小 ...

  9. 数据结构与算法基础(java版)

    目录 数据结构与算法基础(java版) 1.1数据结构概述 1.2算法概述 2.1数组的基本使用 2.2 数组元素的添加 2.3数组元素的删除 2.4面向对象的数组 2.5查找算法之线性查找 2.6查 ...

最新文章

  1. PTA 03-树1 树的同构 (25分)
  2. JVM 内存模型:方法区(Method Area)
  3. JAVA设计模式之【建造者模式】
  4. 连接关键词用什么符号
  5. java.sql 拒绝连接_hive jdbc 拒绝连接问题
  6. Eclipse系列的隐藏宝藏-2019年版
  7. [jQuery] jQuery UI怎样自定义组件?
  8. 计算机上没有office2010,《我安装了office2010,为什么桌面-右键-新建中没有excel呢?》 excel文件找不到...
  9. WORD中如何添加复选框控件?
  10. mysql 二进制日志删除_MYSQL 删除二进制日志的 3 个方法
  11. Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化
  12. [MySQL]触发器
  13. 2004-2021年数据库系统工程师软考中级题目及答案
  14. idea中字体由繁体变简体
  15. 电机系列(1) - foc最基本原理、clark变换 、park变换、附代码
  16. 部署新浪云静态页面和服务器步骤
  17. 电磁兼容试验和测量技术标准 GB 17626 简介
  18. Android Execution failed for task ‘:app:mergeDebugResources‘.
  19. Rails 用 RJS 简单有效的实现页面局部刷新
  20. 【Mysql】----基础练习

热门文章

  1. mac恢复出厂设置_如何恢复Mac的出厂设置
  2. OpenCV:直方图均衡
  3. python 使用多个elif代码块 计算阶梯电费
  4. 《构建高性能Web站点》
  5. 物联网技术周报第 103 期: DIY 智能音箱:基于 Raspberry Pi + Snowboy + AVS
  6. Android自定义控件:NestedScrolling实现仿魅族flyme6应用市场应用详情弹出式layout
  7. Android仿微信图片编辑处理:文字,马赛克,裁剪,涂鸦,旋转图片等
  8. Raspberry Pi (树莓派) - 图形化界面启动和命令行界面启动
  9. 英文单词搜索之词霸搜索
  10. 关于给hexo博客增加视频vlog页面(主要引入哔哩哔哩视频)