文章目录

  • 插入排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
    • 算法稳定性
  • 优化-折半插入排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
    • 算法稳定性
  • 希尔排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
    • 算法稳定性
  • 冒泡排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
    • 算法稳定性
  • 快速排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
    • 算法稳定性
  • 简单选择排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
    • 算法稳定性
  • 堆排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
    • 算法稳定性
  • 归并排序
    • Code实现
    • 时间复杂度
    • 空间复杂度
  • 利用hash的思想进行排序
    • Code实现
    • 时间复杂度

插入排序


Code实现

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

时间复杂度

  • 最好:O(n) → 基本有序
  • 最坏:O(n2) → 原本逆序
  • 平均: O(n2)

空间复杂度

O(1)

算法稳定性

稳定


优化-折半插入排序


Code实现

public static void Half_Insert_Sort(int[] nums) {for (int i = 2; i < nums.length; i++) {nums[0] = nums[i];int low = 1;int high = i - 1;while (low <= high) {int mid = (low + high) / 2;if (nums[mid] > nums[0])high = mid - 1;elselow = mid + 1;}for (int j = i - 1; j > high; j--) {nums[j + 1] = nums[j];}nums[high + 1] = nums[0];}nums[0] = 0;}

时间复杂度

  • 最好:O(n) → 基本有序
  • 最坏:O(n2) → 原本逆序
  • 平均: O(n2)

空间复杂度

O(1)

算法稳定性

稳定


希尔排序


Code实现

public static void Shell_Sort(int[] nums) {int increment;//增量for (increment = nums.length / 2; increment >= 1; increment /= 2) {for (int i = increment + 1; i < nums.length; i++) {if (nums[i] < nums[i - increment]) {nums[0] = nums[i];int j;for (j = i - increment; j > 0 && nums[0] < nums[j]; j -= increment) {nums[j + increment] = nums[j];}nums[j + increment] = nums[0];}}}nums[0] = 0;}

时间复杂度

  • 未知,但是优于直接插入排序
  • 和增量序列d1、d2、d3…的选择有关,目前无法用数学手段证明确切的时间复杂度
  • 最坏时间复杂度:O(n2)
  • 当n在某个范围时,可达O(n1.3)

空间复杂度

O(1)

算法稳定性

不稳定


冒泡排序


Code实现

public static void Bubble_Sort(int[] nums) {boolean isOrder = false;//标志位for (int i = 1; i < nums.length - 1; i++) {//第几层for (int j = nums.length - 1; j > 1; j--) {//两两比较找出最小的if (nums[j] < nums[j - 1]) {nums[0] = nums[j];nums[j] = nums[j - 1];nums[j - 1] = nums[0];isOrder = false;}}if (isOrder == true)break;//当某一趟没有出现交换时,可以认为此时的数组已经整体有序,可以直接退出循环,减少不必要的循环次数,有点点重复性剪枝的思想}nums[0] = 0;}

时间复杂度

  • 最好:O(n) → 有序
  • 最差:O(n2) → 逆序
  • 平均:O(n2)

空间复杂度

O(1)

算法稳定性

稳定


快速排序


Code实现

//一趟排序
public static int Partition(int[] nums, int low, int high) {int pivot = nums[low];while (low < high) {while (low < high && nums[high] >= pivot)high--;nums[low] = nums[high];while (low < high && nums[low] < pivot)low++;nums[high] = nums[low];}nums[low] = pivot;return low;}
//具体快速排序过程public static void Quick_Sort(int[] nums, int low, int high) {if (low < high) {int pivotpos = Partition(nums, low, high);Quick_Sort(nums, low, pivotpos);Quick_Sort(nums, pivotpos + 1, high);}}

时间复杂度

  • 最好:O(n2) → 每次划分很平均
  • 最坏:O(nlogn) → 原本正序或逆序
  • 平均:O(nlogn)

空间复杂度

  • 最好:O(n)
  • 最坏:O(logn)

算法稳定性

不稳定


简单选择排序


Code实现

public static void Simple_Selection_Sort(int[] nums) {//每一趟在待排序元素中选取关键字最小的元素加入有序子序列for (int i = 1; i < nums.length; i++) {int min = i;for (int j = i; j < nums.length; j++) {if (nums[j] < nums[min])min = j;}if (i != min) {int temp = nums[i];nums[i] = nums[min];nums[min] = temp;}}}

时间复杂度

O(n2)

空间复杂度

O(1)

算法稳定性

不稳定


堆排序


Code实现

public static void Heap_Sort(int[] nums, int len) {//len为待排序的数字数目BuildMaxHeap(nums, len);for (int i = len; i > 0; i--) {int temp = nums[i];nums[i] = nums[1];nums[1] = temp;AdjustMaxHeap(nums, 1, i - 1);}nums[0] = 0;}public static void BuildMaxHeap(int[] nums, int len) {for (int i = len / 2; i > 0; i--) {AdjustMaxHeap(nums, i, len);}}public static void AdjustMaxHeap(int[] nums, int k, int len) {//表示从第k个数字开始调整整个数组为大根堆nums[0] = nums[k];for (int i = 2 * k; i <= len; i *= 2) {if (i < len && nums[i] < nums[i + 1])i += 1;if (nums[i] <= nums[0]) break;else {nums[k] = nums[i];k = i;}}nums[k] = nums[0];}

时间复杂度

  • 建堆: O(n)
  • 排序:O(nlog2n)
  • 总的时间复杂度:O(nlog2n)

空间复杂度

O(1)

算法稳定性

不稳定


归并排序


Code实现

 static int N = 1000001;static int[] assist = new int[N];//这里的数组大小根据你待排序数组的大小确定public static void merge(int[] nums, int low, int mid, int high) {for (int i = low; i <= high; i++) {assist[i] = nums[i];//把nums数组里面的数据保存到assist数组里面}int i, j, k = low;for (i = low, j = mid + 1; i <= mid && j <= high; ) {if (assist[i] <= assist[j])nums[k++] = assist[i++];else {nums[k++] = assist[j++];}}while (i <= mid) {nums[k++] = assist[i++];}while (j <= high) {nums[k++] = assist[j++];}}public static void Merge_Sort(int[] nums, int low, int high) {if (low < high) {int mid = (low + high) / 2;//分治思想Merge_Sort(nums, low, mid);Merge_Sort(nums, mid + 1, high);merge(nums, low, mid, high);}

时间复杂度

O(nlog2n)

空间复杂度

O(n)


利用hash的思想进行排序


Code实现

//使用数组的下标对正整数排序
//哈希表的表长度需要超过最大待排序数字public static void Hash_Sort() {int[] random = {999, 1, 444, 7, 88, 5, 66, 98, 20, 1, 888, 652, 59, 23, 48, 60, 481, 105, 8, 28};int[] hash_map = new int[1000];//这里的数组大小是根据你待排序数组里面的值域确定的for (int i = 0; i < random.length; i++) {hash_map[random[i]]++;}for (int i = 0; i < hash_map.length; i++) {for (int j = 0; j < hash_map[i]; j++) {//若有重复的记录说明数字重复,也输出出来//这里还把未出现过的数字即出现次数为0的数字给筛选掉了System.out.print(i + " ");}}System.out.println();}

时间复杂度

O(表长+元素个数)


Java实现的各种排序算法相关推荐

  1. java冒泡排序_Java专题(二):Java中常见的排序算法有哪些?---冒泡排序

    排序相关的的基本概念排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域,即多个数据成员 ...

  2. Java 提供的默认排序算法

    Java 提供的默认排序算法. 这个问题本身就是有点陷阱的意味,因为需要区分是 Arrays.sort() 还是 Collections.sort() (底层是调用 Arrays.sort()):什么 ...

  3. Java数据结构第一讲-排序算法

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  4. 数据结构(三) 用java实现七种排序算法。

    很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...

  5. [Leetcode][JAVA][第912题][排序算法]

    [问题描述] 给你一个整数数组 nums,将该数组升序排列. 示例 1: 输入:nums = [5,2,3,1] 输出:[1,2,3,5] [解答思路] 1.插入排序(熟悉) 每次将一个数字插入一个有 ...

  6. Java中常见的排序算法代码演示

    package cn.xbz;import java.util.Arrays;/*** 各种排序法的演示* @author xbz**/ public class ArraySort {public ...

  7. dv算法java实现_各种排序算法的分析及java实现(二)

    更多精彩,请点击上方蓝字关注我们! 上次跟大家分享了下各种排序算法的分析及java实现(一)的相关知识,今天跟大家分享各种排序算法的分析及java实现(二)的知识.昨天我们讲到了选择排序,今天我们继续 ...

  8. 【Java 9】【排序算法】【微信开发】【反钓鱼】【Spring】| Chat · 预告

    1 Java 9 平台模块系统初探 作者简介: 成富,十年全栈软件开发经验,精通多门编程语言与前后端开发,涉猎诸多软件技术. 创业公司首席软件工程师.新技术的狂热追求者与布道者. 出版书籍<深入 ...

  9. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  10. Java几种常见排序算法与代码实现

    前言: 排序算法也算是每年校招.春招.社招都会问到的问题,虽然每次复习了就忘,但是也可以隔一段时间又拿出来看看. 其中,排序方式指,内部还是外部排序.只需要内部内存就可以的称为内部排序,数据量太大需要 ...

最新文章

  1. oracle 度量 预警,度量阀值预警总结
  2. 六十六、Leetcode数组系列(中篇)
  3. Springboot日志log4j的配置
  4. Atitit.js图表控件总结
  5. 巴伦周刊:“物联网”正走向死胡同
  6. 实木地板被机器人弄成坑_实木地板的常规保养
  7. 锻炼编程能力的10个游戏:通关既巅峰!
  8. MSE(Media Source Extensions)介绍
  9. 实例变量,局部变量,全局变量,静态全局变量。
  10. Visio2016安装
  11. 易辅客栈-第16套从零学手游脚本实战
  12. google地图距离算法_java – 使用谷歌地图计算实际行进距离
  13. nmds与mds的区别_通过ggplot2为NMDS的椭圆添加特定的形状和线型
  14. MAC安装Securecrt破解
  15. HONOR Magicbook 进不了系统
  16. 百度百科之中秋节——百度又在中国一个新领域处于领先了,Google……
  17. 免费使用IDEA,Pycharm等官方正版软件Jetbrains学生认证教程
  18. Tiled的qbs方式编译记录
  19. Leetcode-数据结构-53.最大子数组和
  20. 小米手机连接校园网无法跳转到登录界面

热门文章

  1. springboot菜鸟入门
  2. 【数据采集与数据清洗】课堂笔记
  3. ubuntu安装vasp_Ubuntu常用软件的安装
  4. 警察抓小偷打字游戏JAVA_打字游戏警察抓小偷_警察抓小偷打字游戏下载[2012]-下载之家...
  5. FOC电机库 定点PID代码分析
  6. ibm x5服务器系统重装,IBM 3850 X5 Server安装Windows 2003步骤说明
  7. mybatis3动态创建表,判断表是否存在,删除表
  8. 在线代码图片生成工具carbon
  9. Unity 3D DevLog-WebGL
  10. 陈纪修老师《数学分析》 第02章:数列极限 笔记