文章目录

  • 插入排序
  • 归并排序
  • 求小合
  • 快排3.0
    • 堆排序
    • 小根堆
    • 比较器
  • 桶排序
  • 总结

插入排序

//插入排序public static void insertionsort(int[] arr){if (arr == null || arr.length < 2){return;}for (int i = 0; i < arr.length; i++) {for (int j = i-1; j >= 0 ; j--) {if (arr[j] > arr[j+1]){sway(arr,j,j+1);}}}}

归并排序

    //归并排序public static void process(int[] arr,int L, int R){if (L == R){return;}int mid = L + ((R - L) >> 1);process(arr,L,mid);process(arr,mid+1,R);merge(arr,L,mid,R);}private static void merge(int[] arr, int l, int mid, int r) {int[] help = new int[r-l+1];int i = 0;int p1 = l;int p2 = mid+1;while (p1 <= mid && p2 <= r){help[i++] = arr[p1] <= arr[p2]? arr[p1++] : arr[p2++];}while (p1 <= mid){help[i++] = arr[p1++];}while (p2 <= r){help[i++] = arr[p2++];}for (int j = 0; j < help.length; j++) {arr[l+j] = help[j];}}

求小合

public static int process(int[] arr,int left,int right){if (left == right){return 0;}int mid = left + ((right - left) >> 1);return process(arr,left,mid)+ process(arr,mid+1,right)+ merge(arr,left,mid,right);}private static int merge(int[] arr, int left, int mid, int right) {int[] help = new int[right-left+1];int i = 0;int p1 = left;int p2 = mid+1;int res = 0;while (p1 <= mid && p2 <= right){res += arr[p1] < arr[p2] ? (right - p2 + 1) * arr[p1] : 0;help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];}while (p1 <= mid){help[i++] = arr[p1++];}while (p2 <= right){help[i++] = arr[p2++];}for (int j = 0; j < help.length; j++) {arr[left+j] = help[j];}return res;}

快排3.0

    public static void quickSort(int[] arr,int left,int right){if (left < right){swap(arr,left+(int)(Math.random()*(right-left+1)),right);int[] p = partition(arr,left,right);quickSort(arr,left,p[0]-1);quickSort(arr,p[1]+1,right );}}private static int[] partition(int[] arr, int left, int right) {int less = left -1;int more = right;while (left < more){if (arr[left] < arr[right]){swap(arr, ++less, left++);}else if (arr[left] > arr[right]){swap(arr,--more,left);}else {left++;}}swap(arr,more,right);return new int[] {less+1,more};}public static void swap(int[] arr,int a,int b){int temp=0;temp = arr[a];arr[a] = arr[b];arr[b] = temp;}

    //插入一个数public static void heapinsert(int[] arr, int index){while (arr[index] > arr[(index-1)/2]){swap(arr,index,(index-1)/2);index = (index-1)/2;}}//移除一个数public static void heapify(int[] arr, int index, int heapsize){int left = index*2+1;while (left < heapsize){int 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 swap(int[] arr,int a,int b){int temp=0;temp = arr[a];arr[a] = arr[b];arr[b] = temp;}

堆排序

    //堆排序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);}}

小根堆


小根堆就是优先级队列

扩容代价低

    //小根堆public static void sortArrDistanceLessK(int[] arr, int k){PriorityQueue<Integer> heap = new PriorityQueue<>();int index = 0;for (; index <= Math.min(arr.length, k); index++) {heap.add(arr[index]);}int i = 0;for (; index < arr.length; index++,i++) {heap.add(arr[index]);arr[i] = heap.poll();}while (!heap.isEmpty()){arr[i++] = heap.poll();}}

比较器

    //比较器public static class AComp implements Comparator<Integer> {//如果返回负数,第一个数在上面//如果返回正数,第二个数在上面//如果返回0,无所谓// (假设o1<o2,升序o1-o2,降序o2-o1)@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}}用法:PriorityQueue<Integer> haed = new PriorityQueue<Integer>(new AComp());

桶排序


   public 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 left, int right, int digit){final int radix = 10;int  j =0;int[] bucket = new int[right-left+1];for (int k = 1; k <= digit; k++) {int[] count = new int[radix];for (int l = left; l <= right ; l++) {j = getDigit(arr[l],k);count[j]++;}for (int l = 1; l < radix ; l++) {count[l] = count[l]+count[l-1];}for (int l = right; l >= left  ; l--) {j = getDigit(arr[l],k);bucket[count[j]-1] = arr[l];count[j]--;}for (int i = left,o=0; i < right; i++,o++) {arr[i] = bucket[o];}}}private static int getDigit(int i, int k) {return ((i/((int) Math.pow(10,k-1)))%10);}
}

总结



左程云 Java 笔记--排序相关推荐

  1. 【左程云Java算法】Chapter1-5:用一个栈实现另一个栈的排序

    [左程云Java算法]Chapter1-5:用一个栈实现另一个栈的排序 [题目] 用一个栈实现另一个栈的排序 [要求] 一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个 ...

  2. 左程云算法笔记(四)哈希表和有序表的使用、链表

    左程云算法笔记(四) 哈希表的使用 有序表的使用 链表 单链表反转 (LC206) 双向链表反转 打印两个有序链表的公共部分 合并两个有序链表(LC21) 判断一个链表是否为回文结构 (LC234) ...

  3. 左程云算法笔记总结-基础篇

    基础01(复杂度.基本排序) 认识复杂度和简单排序算法 时间复杂度 big O 即 O(f(n)) 常数操作的数量写出来,不要低阶项,只要最高项,并且不要最高项的系数 一个操作如果和样本的数据量没有关 ...

  4. 简单排序【左程云Java】

    基数排序.桶排序和计数排序的区别_计数排序和桶排序_Rnan-prince的博客-CSDN博客 目录 一.归并排序 1.归并排序的思想 2.代码实现 3.时间复杂度计算 4.归并排序的扩展 :小和问题 ...

  5. 算法与数据结构——算法基础——二叉树(java)(b站左程云课程笔记整理)

    二叉树 了解一个二叉树的递归序.先序.中序.后序 递归序:每个数会被打印三次(可以理解为前中后) 先序:头左右 中序:左头右 后序:左右头 public static class Node {publ ...

  6. 左程云算法笔记总结-基础提升篇

    提升01(哈希) 认识哈希函数 哈希函数的输入一般需要是无穷尽的,没有限制:输出可以有一定的范围,比如MD5加密后产生的字符串可以有2的32次方-1种,用十六进制表示需要16个字符. 相同的输入对应相 ...

  7. 数据结构与算法XS班-左程云第一节课笔记(位运算、算法是什么、简单排序)

    第1节 位运算.算法是什么.简单排序 ##这是数据结构与算法新手班-左程云第一节课的笔记## 1. 位运算 // 你们会不会表示一个数字的32位啊? // Java中int类型默认以32位二进制数在计 ...

  8. 数据结构与算法XS班-左程云第八节课笔记(归并排序和快速排序)

    第8节 归并排序和快速排序 ##这是数据结构与算法新手班-左程云第八节课的笔记## 归并排序 归并排序实际上是一个很经典的排序方法,时间复杂度o(N*logN). 递归版本(图解排序算法(四)之归并排 ...

  9. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  10. LeetCode左程云算法课笔记

    左程云算法课笔记 剑指Offer 位运算 ^运算符理解 寻找出现双中的单数 取出一个数最右边1的位置 找所有双出现中的两个单数 整数二进制奇数位偶数位交换 数组中全部出现k次返回出现一次的数 链表 判 ...

最新文章

  1. 牛客--追债之旅 两种解法
  2. ValueError: fill value must be in categories.
  3. 性价比高出英特尔45%,亚马逊的云服务器芯片如何做到?| 解读
  4. tomcat配置文件详解
  5. php后台接受上传图片
  6. 华为机试——简单密码
  7. 《我是歌手》你是歌手你会选什么时间参赛?
  8. 计算机桌面图标的排列,如何进行桌面图标排列 让你的桌面一秒变酷炫【图文教程】...
  9. 【译】适合dba和开发者的mysql最佳实践
  10. slf4j使用(二)
  11. js 判断字符是否以汉字开头
  12. 如何构建企业安全易用的数据资产
  13. 利用集成学习(Adaboost(DTs))对高光谱影像数据集(mat)分类
  14. 四叶草关闭啰嗦模式_教你如何解决 Win7 64位卡LOGO(四叶草)
  15. Python好酷|allpairspy一款高效的正交实验法生成用例工具
  16. yolov5m.pt triton部署
  17. Cannot find entry: /target/m2e-wtp/web-resources
  18. Android中的传感器之---光线传感器
  19. Android Bmob
  20. java 中文编码乱码_Java编码问题复习

热门文章

  1. 【矩阵论 图论】期末考试复习思维导图
  2. 修改dataV轮播表背景图
  3. word转pdf或者打印后题注编号变成大写
  4. VC6.0致命错误 RC1015: 无法打开包含文件 'afxres.h'.解决方法
  5. 火车头翻译-火车头采集翻译插件使用教程【2022】
  6. PTAM特征点法跟踪和建图 SLAM FAST Patch
  7. PTAM + OpenCV3.4.1 + Ubuntu16.04
  8. SDR SDRAM控制器设计
  9. rh系列服务器上电后按,SV12 RH系列机架服务器操作系统安装.pdf
  10. 风尚云网学习-vue-element-admin安装问题