• 四大常见的排序算法JAVA


    1. 冒泡排序

    1. 相邻的元素两两比较,大的放右边,小的放左边

    2. 第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推

    3. 如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以

     

     

    1. package Bubble;
    2. /*
    3. 冒泡排序:
    4. 核心思想:
    5. 1,相邻的元素两两比较,大的放右边,小的放左边。
    6. 2,第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面以此类推。
    7. 3,如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以。
    8. */
    9. public class demo1 {
    10. public static void main(String[] args) {
    11. //1.定义数组
    12. int[] arr = {2, 4, 5, 3, 1};
    13. //2.利用冒泡排序将数组中的数据变成 1 2 3 4 5
    14. int[] newArr = bubble_sort(arr);
    15. for (int i = 0; i < newArr.length; i++) {
    16. System.out.print(newArr[i] + " ");
    17. }
    18. }
    19. private static int[] bubble_sort(int[] arr) {
    20. //外循环: 表示我要执行多少论,如果有n个数据,那么执行n-1论
    21. for (int i = 0; i < arr.length - 1; i++) {
    22. for (int j = 0; j < arr.length - 1 - i; j++) {
    23. //内循环:每一轮中我如何比较数据并且找到当前的最大值
    24. //-1:为了防止索引越界
    25. //-i:提高效率,每一轮执行的次数应该比上一轮少一次
    26. if (arr[j] > arr[j + 1]) {
    27. int temp = arr[j];
    28. arr[j] = arr[j + 1];
    29. arr[j + 1] = temp;
    30. }
    31. }
    32. }
    33. return arr;
    34. }
    35. }

     

    2.选择排序

    1. 从0索引开始,跟后面的元素一一比较

    2. 小的放前面,大的放后面

    3. 第一次循环结束后,最小的数据已经确定

    4. 第二次循环从1索引开始以此类推

    5. 第三轮循环从2索引开始以此类推

    6. 第四轮循环从3索引开始以此类推。

     

     

     

            

    1. package Bubble;
    2. //选择排序
    3. public class demo2 {
    4. public static void main(String[] args) {
    5. int[] arr = {4, 32, 1, 5, 6};
    6. //外循环:几轮
    7. //i表示这一轮当中,我拿着哪个的索引上的数据跟后面的数据进行交换
    8. for (int i = 0; i < arr.length - 1; i++) {
    9. for (int j = i + 1; j < arr.length; j++) {
    10. //内循环:每一轮拿着i跟i后面的数据进行比较交换
    11. if (arr[i] > arr[j]) {
    12. int temp = arr[i];
    13. arr[i] = arr[j];
    14. arr[j] = temp;
    15. }
    16. }
    17. }
    18. for (int i = 0; i < arr.length; i++) {
    19. System.out.print(arr[i] + " ");
    20. }
    21. }
    22. }

    3.插入排序

    插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过创建有序序列和无序序列,然后再遍历无序序列得到里面每一个数字,把每一个数字插入到有序序列中正确的位置。

    插入排序在插入的时候,有优化算法,在遍历有序序列找正确位置时,可以采取二分查找

    将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。

    遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。

    N的范围:0~最大索引

    1. package Bubble;
    2. /*
    3. 插入排序:
    4. 将0索引的元素到N索引的元素看做是有序的,把N+1索引的元素到最后一个当成是无序的。
    5. 遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同数据,插在后面。
    6. N的范围:0~最大索引
    7. */
    8. public class demo3 {
    9. public static void main(String[] args) {
    10. int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
    11. //1.找到无序的哪一组数组是从哪个索引开始的。 2
    12. int startIndex = -1;
    13. for (int i = 0; i < arr.length; i++) {
    14. if (arr[i] > arr[i + 1]) {
    15. startIndex = i + 1;
    16. break;
    17. }
    18. }
    19. //2.遍历从startIndex开始到最后一个元素,依次得到无序的哪一组数据中的每一个元素
    20. for (int i = startIndex; i < arr.length; i++) {
    21. //记录当前要插入数据的索引
    22. int j = i;
    23. while (j > 0 && arr[j] < arr[j - 1]) {//j>0: 和前一个元素比较索引必须大于0
    24. //交换
    25. int tmp = arr[j];
    26. arr[j] = arr[j - 1];
    27. arr[j - 1] = tmp;
    28. j--;
    29. }
    30. }
    31. for (int i = 0; i < arr.length; i++) {
    32. System.out.print(arr[i] + " ");
    33. }
    34. }
    35. }

     

    递归算法

    1. package dg;
    2. public class demo1 {
    3. public static void main(String[] args) {
    4. //利用递归球1-100之间的和
    5. int sum = getSum(100);
    6. System.out.println(sum);
    7. }
    8. //大问题拆解小问题
    9. //1~100之间的和=100+(1~99之间的和)
    10. //1~99之间的和=99+(1~98之间的和)
    11. //1~98之间的和=98+(1~97之间的和)
    12. //....
    13. //1~2之间的和=2+(1~1之间的和)
    14. //1~1之间的和就是1
    15. public static int getSum(int num){
    16. if(num==1)
    17. return 1;
    18. else{
    19. return num+getSum(num-1);
    20. }
    21. }
    22. }

    1. package dg;
    2. public class demo2 {
    3. public static void main(String[] args) {
    4. //递归求5的阶乘
    5. int factorial = getFactorial(5);
    6. System.out.println(factorial);
    7. }
    8. public static int getFactorial(int n) {
    9. //5!=5*4*3*2*1
    10. //5!=5*4!
    11. //4!=4*3!
    12. //3!=3*2!
    13. //2!=2*1!
    14. //1!=1
    15. if (n == 1) {
    16. return 1;
    17. } else {
    18. return n * getFactorial(n - 1);
    19. }
    20. }
    21. }

    4. 快速排序

    1. 从数列中挑出一个元素,一般都是左边第一个数字,称为 "基准数";

    2. 创建两个指针,一个从前往后走,一个从后往前走。

    3. 先执行后面的指针,找出第一个比基准数小的数字

    4. 再执行前面的指针,找出第一个比基准数大的数字

    5. 交换两个指针指向的数字

    6. 直到两个指针相遇

    7. 将基准数跟指针指向位置的数字交换位置,称之为:基准数归位。

    8. 第一轮结束之后,基准数左边的数字都是比基准数小的,基准数右边的数字都是比基准数大的。

    9. 把基准数左边看做一个序列,把基准数右边看做一个序列,按照刚刚的规则递归排序

    ① 

    首先把0索引当做基准数,如图6为基准数,确定左下标start,右下标end,start下标是找比基准数大的数,

    end是找比基准数小的数 ,先找end,找到了1停下,然后找start的数,找到停下并且交换,一直start++,end--,直到start和end指向同一根数   ,如下图

    那么指向同一个数的下标就是基准数要存入的位置,也就是基准数要放入的地方

    专业名称:基准数归位,基准数左边的都比基准数小,右边的都比基准数大

     

    找到第一个基准数以后,然后利用这个基准数分为二边,然后左边利用第一个索引3为基准数在左边进行排序,在利用9在右边排序

    1. package Bubble;
    2. /*
    3. 快速排序:
    4. 第一轮:以0索引的数字为基准数,确定基准数在数组中正确的位置。
    5. 比基准数小的全部在左边,比基准数大的全部在右边。
    6. 后面以此类推。
    7. */
    8. public class demo4 {
    9. public static void main(String[] args) {
    10. int[] arr = {6, 2, 7, 9, 3, 4, 5, 1, 10, 8};
    11. qsort(arr, 0, arr.length - 1);
    12. for (int i = 0; i < arr.length; i++) {
    13. System.out.print(arr[i] + " ");
    14. }
    15. }
    16. /*
    17. * 参数一:我们要排序的数组
    18. * 参数二:要排序数组的起始索引
    19. * 参数三:要排序数组的结束索引
    20. * */
    21. public static void qsort(int[] arr, int i, int j) {
    22. //定义两个变量记录要查找的范围
    23. int start = i;
    24. int end = j;
    25. if(start > end){
    26. //递归的出口
    27. return;
    28. }
    29. //定义基准数
    30. int baseNumber = arr[i];
    31. while (start != end) {
    32. //利用end,从后往前走,找到基准数小的就停下
    33. while (true) {
    34. if (end <= start || arr[end] < baseNumber) {
    35. break;
    36. }
    37. end--;
    38. }
    39. //利用start,前往后走,找到基准数大的就停下
    40. while (true) {
    41. if (end <= start || arr[start] > baseNumber) {
    42. break;
    43. }
    44. start++;
    45. }
    46. //交换end和start所指向的数
    47. int tmp = arr[start];
    48. arr[start] = arr[end];
    49. arr[end] = tmp;
    50. }
    51. //当start和end指向了同一个元素的时候,那么上面的循环就会结束
    52. //表示已经找到了基准数在数组中应存入的位置
    53. //基准数归位
    54. //就是拿着这个范围中的第一个数字,跟start指向的元素进行交换
    55. int tmp = arr[i];
    56. arr[i] = arr[start];
    57. arr[start] = tmp;
    58. //确定6左边的范围,重复刚刚所做的事情
    59. qsort(arr, i, start - 1);
    60. //确定6右边的范围,重复刚刚所做的事情
    61. qsort(arr,start + 1,j);
    62. }
    63. }

    总结

  • 相关阅读:
    PLC易学但是后期如何发展?
    基于SpringBoot的合家云社区物业管理平台 - 项目介绍
    【操作系统】第五章:设备管理
    智工教育:每年必考!教师编制这些考点必背!
    Python 对象表现得像函数
    Halcon相机外参自理解
    MES系统中的派工单及其关键应用
    LongLoRA:超长上下文,大语言模型高效微调方法
    4.1.3 名称的特殊处理
    “带薪划水”偷刷阿里老哥的面经宝典,三次挑战字节,终成正果
  • 原文地址:https://blog.csdn.net/weixin_65752158/article/details/140241295