左程云基础班——排序算法

1. 插入排序

//  插入排序,比较有效地排序方法public static void insertionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 1; i < arr.length; i++) {//使0到i范围内有序for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {swap(arr, j, j + 1);}}}
//  交换数组中的i, j位置上的元素private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

2. 选择排序

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

3. 冒泡排序

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

4. 归并排序

    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 p = l;//左侧int q = mid + 1;//右侧while (p <= mid && q <= r) {//相等元素优先合并左侧节点,保证稳定性help[i++] = arr[p] <= arr[q] ? arr[p++] : arr[q++];}while (p <= mid) {help[i++] = arr[p++];}while (q <= r) {help[i++] = arr[q++];}//辅助数组,保存归并结果for (i = 0; i < help.length; i++) {arr[l + i] = help[i];}}

5. 快速排序

    public static void QuickSort(int[] arr) {if (arr == null || arr.length < 2) {return;}QuickSort(arr, 0, arr.length - 1);}private static void QuickSort(int[] arr, int l, int r) {if (l < r) {//随机选择一个元素作为分隔,并将其放在数组末尾swap(arr, l + (int) (Math.random() * (r - l + 1)), r);//part数组返回分隔位置int[] part = partiton(arr, l, r);QuickSort(arr, l, part[0] - 1);            //由于最后一步的交换使得part[1] 位置的数等于中间值,part[1] + 1QuickSort(arr, part[1] + 1, r);//满足输入参数的边界要求}}private static int[] partiton(int[] arr, int l, int r) {int s = l - 1;//小数边界int b = r;//大数边界while (l < b) {if (arr[l] < arr[r]) {//++s 和 l++ 保证了边界swap(arr, ++s, l++);}else if (arr[l] > arr[r]) {//l 不向前移动swap(arr, --b, l);   }else {l++;}}swap(arr, b, r);//s+1 防止当 s=l-1时出现数组越界return new int[]{s + 1, b};//保证返回的下标不越界}

6. 堆排序(堆结构更重要)

    public static void heapSort(int[] arr) {if (arr == null || arr.length < 2) {return;}//注意下标从0开始for (int i = 0; i < arr.length; i++) {heapInsert(arr, i);}int size = arr.length;swap(arr, 0, --size);while (size > 0) {heapFy(arr, 0, size);swap(arr, 0, --size);}}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 heapFy(int[] arr, int index, int size) {int left = 2 * index + 1;while (left < size) {//寻找index节点和其两个子节点中的最大值int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;largest = arr[largest] > arr[index] ? largest : index;if (largest == index) {break;}swap(arr, index, largest);index = largest;left = 2 * index + 1;}}

7. 基数排序

    //digit 数组中最大数的数位,即循环的轮数public static void RadixSort(int[] arr, int begin, int end, int digit) {final int radix = 10;int i = 0, j= 0;int[] help = new int[end - begin + 1];for (int d = 1; d <= digit; d++) {int[] count = new int[radix];for (i = begin; i <= end; i++) {//基数上的数字个数j = getDigit(arr[i], d);count[j]++;}//基数上的前部分和for (i = 1; i < count.length; i++) {count[i] = count[i] + count[i - 1];}//从右侧开始,确定位置,保证相对顺序不变for (i = end; i >= begin; i--) {j = getDigit(arr[i], d);//-1原因数组从0开始,可画图演示help[count[j] - 1] = arr[i];count[j]--;}//辅助数组,保存结果for (i = begin, j = 0; i <= end; i++, j++) {arr[i] = help[j];}}}//求取基数private static int getDigit(int x, int d) {return ((x / (int)Math.pow(10, d - 1))) % 10;}

8. 总结

  1. 不具备稳定性的排序:

    选择排序、快速排序、堆排序

  2. 具备稳定性的排序:

    冒泡排序、插入排序、归并排序、一切桶排序思想下的排序

  3. 目前没有找到时间复杂度O(N*logN),额外空间复杂度O(1),又稳定的排序。

  4. 一般排序:快速排序、追求稳定:归并排序、节省空间:堆排序

左程云基础班——排序算法相关推荐

  1. 左程云基础班——二叉树

    左程云基础班--二叉树 1. 遍历二叉树 二叉树结点: public class Node {public int value;public Node left;public Node right;p ...

  2. 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

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

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

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

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

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

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

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

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

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

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

  8. CSDN专访左程云,算法之道

    算法的庞大让很多人畏惧,程序员如何正确的学习并应用于面试.工作中呢?今天,CSDN邀请了IBM软件工程师.百度软件工程师.刷题5年的算法热爱者左程云,来担任CSDN社区问答栏目的第二十六期嘉宾,届时会 ...

  9. 左程云:程序员该如何学习算法?

    大家好,我是左程云.我本科就读于华中科技大学.硕士毕业于在芝加哥大学.先后在IBM.百度.GrowingIO和亚马逊工作,是一个刷题7年的算法爱好者. 我是<程序员代码面试指南--IT名企算法与 ...

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

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

最新文章

  1. DeepChem | DeepChem的图卷积特征化器
  2. 批量修改文件名称(Python)
  3. [置顶]       Javascript js中页面的重新加载
  4. pynlpir.LicenseError: Your license appears to have expired. Try running pynlpir update.
  5. 2.12日递推专题第一题
  6. springcloud——eureka小错误Caused by: java.net.UnknownHostException: eureka7003.com
  7. java long to float_为什么Java中long可以自动转换成float
  8. os.path.join拼接错误
  9. 目录:所以文章的目录
  10. Laravel后台 + AngularJS前端 的网站构建与维护
  11. MySQL Workbench 6.3CE 汉化及使用教程(转载)
  12. 专家建议|2022内容运营的5大SEO错误以及如何避免
  13. 如何破解Win7之开机密码
  14. Hive实现获取指定月的第一天和最后一天
  15. 运筹学4个人完成三项工作_【用人话讲运筹学】十一、指派问题
  16. 树莓派 更换键盘 2020_魔改售价2000多元的HHKB键盘!蓝牙双模+外接TF卡+树莓派ZERO...
  17. 2018春招总结(Java后端),干货满满
  18. [2020.8.3]联想 A5(L18011) Magisk ROOT 纯净无推广 一键刷机 ZUI_3.9.068
  19. bootstrap4 利用m- p-调整元素之间距离
  20. php中如何导出表格,PHP如何实现表格Excel的导出

热门文章

  1. ldaptemplate 分页_分页机皮带跑偏调整方法
  2. gartner 服务器虚拟化 市场份额 2013,Gartner:VMware成虚拟化魔力象限领导者
  3. 国密算法 ZUC流密码 祖冲之密码 python代码完整实现
  4. visual studio 2015无法打开包括文件
  5. qt Android 基站定位,AT指令获取基站信息
  6. C# Winform多语言切换
  7. 语音芯片c语言程序,51单片机 语音芯片YF017 驱动函数以及简单调用例程
  8. python识别车辆图片_opencv+python车辆识别
  9. Python糗百爬虫(精简版)
  10. IntelliJ IDEA 字体配置常用快捷键