当前位置: 首页 > news >正文

八大排序(尚未完善)

目录

  • java的数组值交换
  • 1. 冒泡排序
  • 2. 插入排序
  • 3. 选择排序
  • 4. 基数排序
  • 5. 希尔排序
  • 6. 快速排序
  • 7. 归并排序
  • 8. 堆排序

基本的流程就不写了,不会就自己看代码,按照代码跑6、7遍就懂了

java的数组值交换

异或交换运算(需要保证位置不同):

public static void swap(int[] arr, int i, int j){arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];      
}

1. 冒泡排序

时间复杂度O(N^2),额外空间复杂度O(1)

public static void bubbleSort(int[] arr){if(arr == null || arr.length < 2)return;for(int e = arr.length - 1; e > 0; e--)for(int i = 0; i < e; i++){if(arr[i] > arr[i + 1])swap(arr, i, i + 1);}}}

2. 插入排序

时间复杂度O(N^2),额外空间复杂度O(1)

public static void insertionSort(int[] arr){if(arr == null || arr.length < 2)return;for(int i = 1; i < arr.length; i ++){for(int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--){swap(arr, j, j + 1);}}}

3. 选择排序

// 选择排序public static void selectSort(int[] arr){if(arr == null || arr.length < 2)return;for(int i = 0; i < arr.length; i ++){int minIndex = i;for(int j = i; j < arr.length; j ++){minIndex = arr[minIndex] < arr[j]? minIndex : j;}if(i == minIndex)continue;swap(arr, i, minIndex);}return;}

4. 基数排序

// 基数排序 daixiepublic static void radixSort(int[] arr){if(arr == null || arr.length < 2)return;radixSort(arr, 0, arr.length - 1, maxbits(arr));}public static int maxbits(int[] arr){int max = Integer.MIN_VALUE;for(int i = 0; i < arr.length; i++){max = Math.max(max, arr[i]);}int res = 0;while(max != 0){res ++;max /= 10;}return res;}public static void radixSort(int[] arr, int L, int R, int digit){final int radix = 10;int i = 0,j = 0;// 有多少个数准备多少个辅助空间int[] bucket = new int[R - L + 1];for(int d = 1; d <= digit; d++){int[] count = new int[radix];for(i = L; i <= R; i++){j = getDigit(arr[i], d);count[j]++;}for(i =1; i < radix; i++){count[i] = count[i] + count[i - 1];}for(i = R; i >= L; i--){j = getDigit(arr[i], d);bucket[count[j] - 1] = arr[i];count[j]--;}for( i = L, j = 0; i <= R; i++, j++){arr[i] = bucket[j];}}}// 取数值public static int getDigit(int x, int d){return ((x / ((int)Math.pow(10, d - 1))) % 10);}

5. 希尔排序

// 希尔排序public static void shellSort2(int[] arr, int gap){for(int i = gap; i < arr.length; i ++){for(int j =i - gap;j >= 0; j -= gap){if(arr[j] > arr[j + gap])swap(arr, j, j + gap);}}return;}// 部分public static void shellSort(int[] arr){if(arr == null || arr.length < 2){return;}int[] gap = new int[arr.length / 2 + 1];int num = 0;int len = arr.length;while(len > 1){gap[num++] = len / 2;len /= 2;}System.out.println(Arrays.toString(gap));System.out.println(num);for(int i =0; i < num; i++)shellSort2(arr, gap[i]);}

6. 快速排序

public static void quickSort(int[] arr){if(arr == null || arr.length < 2){return;}quickSort(arr, 0, arr.length - 1);}public static void quickSort(int[] arr, int L, int R){if(L < R){swap(arr, L + (int)(Math.random() * (R - L + 1)), R);int[] p = partition(arr, L, R);quickSort(arr, L, p[0] - 1);quickSort(arr, p[1] + 1, R);}}

7. 归并排序

待写

8. 堆排序

// heapInsertpublic static void heapInsert(int[] arr, int index){while(arr[index] > arr[(index - 1) / 2]){swap(arr, index, (index - 1) / 2);index = (index - 1) / 2;}}// 某个数在index的位置,能否往下移动public static void heapify(int[] arr, int index, int heapSize){int left = index * 2 + 1;while(left < heapSize){// 两个孩子中,谁值大,下标给largestint largest = left + 1 < heapSize && arr[left + 1] > arr[left]? left + 1 : left;// 父和较大孩子比较largest = arr[largest] > arr[index] ? largest : index;if(largest == index){break;}swap(arr, largest, index);index = largest;left = index * 2 + 1;}}// 堆排序public static void heapSort(int[] arr){if(arr == null || arr.length < 2){return;}// 构造大根堆for(int i = 0; i < arr.length; i++)heapInsert(arr, i);int heapSize = arr.length;swap(arr, 0, --heapSize);while(heapSize > 0){heapify(arr, 0, heapSize);swap(arr, 0, --heapSize);}}

相关文章:

  • 6-95 希尔排序(Java语言描述)
  • 设计模式——抽象工厂模式02
  • 1236. 递增三元组:做题笔记
  • acwing算法提高之图论--floyd算法及其扩展应用
  • 江协STM32:定时器定时中断和定时器定时闹钟
  • 【Python第三方库】lxml 解析器和xpath路径语言
  • 【算法练习】28:选择排序学习笔记
  • 已解决org.apache.lucene.store.AlreadyClosedException: 已经关闭异常的正确解决方法,亲测有效!!!
  • 【项目新功能开发篇】开发编码
  • vue3中播放flv流视频,以及组件封装超全
  • 纯C++设置浮点数精度
  • 4. python练习题4-水仙花数
  • 【Oracle篇】expdp/impdp高效完成全部生产用户的全库迁移(第四篇,总共四篇)
  • 【考研经验贴】24考研860软件工程佛系上岸经验分享【丰富简历、初复试攻略、导师志愿、资料汇总】
  • Java基础 - 代码练习
  • 345-反转字符串中的元音字母
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • C++类的相互关联
  • express + mock 让前后台并行开发
  • idea + plantuml 画流程图
  • JavaScript 一些 DOM 的知识点
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PhantomJS 安装
  • Python 基础起步 (十) 什么叫函数?
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 安卓应用性能调试和优化经验分享
  • 初探 Vue 生命周期和钩子函数
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端存储 - localStorage
  • 前端面试总结(at, md)
  • 微信小程序设置上一页数据
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​虚拟化系列介绍(十)
  • #1015 : KMP算法
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (3)llvm ir转换过程
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (a /b)*c的值
  • (Java数据结构)ArrayList
  • (七)Knockout 创建自定义绑定
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)http协议
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)Linux 多线程条件变量同步
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net MVC4 上传大文件,并保存表单
  • .Net Winform开发笔记(一)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net下的富文本编辑器FCKeditor的配置方法
  • .Net中wcf服务生成及调用
  • .net中生成excel后调整宽度