• 排序-介绍,代码思路,使用建议,代码实现-1


    插入排序 :直接插入排序,希尔排序

    选择排序 :直接选择排序,堆排

    交换排序 :冒泡排序       ,快排

    归并排序 :归并排序

    一:直接插入排序

    1. 简单介绍:时间复杂度O(N^2) , 空间复杂度O(1),稳定一个本身稳定的排序可以是稳定->不稳定,但是不稳定/>稳定

    2. 思路:打扑克牌,往里一个个插,两层for循环,第一层 i=1,第二层 j=i-1 j>=0,(i=1 -> 从第二张牌开始比较)(j=i-1 -> 要比较的第i张牌 与已经有顺序的第 j (i-1) 张最大的牌开始比较)

    3. 建议:数组趋于有序的时候使用

    4. 代码解析:

    5. 代码:

    1. //直接插入排序
    2. public static void insertSort(int[] array){
    3. for (int i = 1; i < array.length; i++) {
    4. int val = array[i];
    5. int j = i-1;
    6. for (; j >= 0; j--) {
    7. if(val < array[j]){
    8. array[j+1] = array[j];
    9. }else {
    10. break;
    11. }
    12. }
    13. array[j+1] = val;
    14. }
    15. }

     

    二:希尔排序

    1. 简单介绍:时间复杂度O(N^1.3~N^1.5) , 空间复杂度O(1),不稳定

    2. 思路:让数据分组,每组数据排序,分的组数越来越小,最后组数为1(实现 分组+直接插入)

                   最小增量算法——跳跃式分组(尽量让小的数据在前面,大的数据在后面,数据更趋于有序)(没有具体说过分多少组,怎么分,所以时间复杂度为一个区间),组内直接插入排序

    3. 建议:数组趋于有序的时候使用

    4. 代码解析:

     5. 代码:

    1. //希尔排序
    2. private static void shell(int[] array,int gap){
    3. for (int i = 1; i < array.length; i++) {
    4. int val = array[i];
    5. int j = i-gap;
    6. for (; j >= 0; j-=gap) {
    7. if(val < array[j]){
    8. array[j+gap] = array[j];
    9. }else {
    10. break;
    11. }
    12. }
    13. array[j+gap] = val;
    14. }
    15. }
    16. public static void shellSort(int[] array){
    17. int gap = array.length;
    18. while (gap > 1){
    19. shell(array,gap);
    20. gap /= 2;
    21. }
    22. shell(array,1);
    23. }

    三 :直接选择排序

    1. 简单介绍:时间复杂度O(N^2) , 空间复杂度O(1),不稳定

    2. 思路:找一遍,找到最小的,与前面的数换(或者你也可以一次找两个,找一个最大的,找一个最小的(这有一个,代码解析标注))

    3. 代码解析:

     4. 代码:

    1. //选择排序 找最小的
    2. public static void selectSort(int[] array){
    3. for (int i = 0; i < array.length; i++) {
    4. int min = i;
    5. for (int j = i+1; j < array.length; j++) {
    6. if(array[j] < array[min]){
    7. min = j;
    8. }
    9. }
    10. swap(array,i,min);
    11. }
    12. }
    13. private static void swap(int[] array,int a,int b){
    14. int c = array[a];
    15. array[a] =array[b];
    16. array[b] = c;
    17. }
    18. //选择排序 找最小的和找最大的
    19. public static void selectSort1(int[] array){
    20. int left = 0;
    21. int right = array.length-1;
    22. while (left
    23. int min = left;
    24. int max = left;
    25. for (int i = left+1; i <= right; i++) {
    26. if(array[i] < array[min]){
    27. min = i;
    28. }
    29. if(array[i] > array[max]){
    30. max = i;
    31. }
    32. }
    33. swap(array,left,min);
    34. if(max == left){
    35. max = min;
    36. }
    37. swap(array,right,max);
    38. left++;
    39. right--;
    40. }
    41. }

    四 :堆排

    1. 简单介绍:时间复杂度O(N^logN) , 空间复杂度O(1),不稳定

    2. 思路:先大根堆,然后让根(最大的数)与最后一个数据换,循环

    3. 代码:

    1. //堆排
    2. public static void heapSort(int[] array){
    3. creatHeap(array);
    4. int end = array.length-1;
    5. while(end >= 0){
    6. swap(array,0,end);
    7. shiftDown(array,0,end);
    8. end--;
    9. }
    10. }
    11. private static void creatHeap(int[] array){
    12. for (int parent = (array.length-1-1)/2; parent >= 0; parent--) {
    13. shiftDown(array,parent,array.length);
    14. }
    15. }
    16. private static void shiftDown(int[] array,int parent,int end){
    17. int child = 2*parent+1;
    18. while (child < end){
    19. if(child+1array[child]<array[child+1]){
    20. child++;
    21. }
    22. if(array[parent] < array[child]){
    23. swap(array,parent,child);
    24. parent = child;
    25. child = 2*parent+1;
    26. }else {
    27. break;
    28. }
    29. }
    30. }

    五 :冒泡排序

    1. 简单介绍:时间复杂度O(N^2) , 空间复杂度O(1),稳定

    2. 思路:两次for循环,第一层i,第二层j (j=0;j

    3. 代码:

    1. public static void bubbleSort(int[] array){
    2. for (int i = 0; i < array.length-1; i++) {
    3. boolean ret = false;
    4. for (int j = 0; j < array.length-1-i; j++) {
    5. if(array[j] > array[j+1]){
    6. swap(array,j,j+1);
    7. ret = true;
    8. }
    9. }
    10. if(!ret){
    11. break;
    12. }
    13. }
    14. }

  • 相关阅读:
    案例分享|智慧化的西部机场
    SpringBoot概念、创建和运行及配置文件
    求求,别在sql里格式化数据了
    学生体育运动主题网页设计——兵乓球国乒网(纯HTML+CSS代码)
    1.什么是jwt?jwt的作用是什么?2.jwt的三个部分是什么?三者之间的关系如何?3.JWT运行的流程是什么
    Hive 剖析
    视频集中存储/直播点播平台EasyDSS点播文件分类功能新升级
    图解Redis 06 | Hash数据类型的原理及应用场景
    低代码技术与仓储管理的新纪元:革命性的供应链变革
    ISO Swift高德导航开发指南
  • 原文地址:https://blog.csdn.net/m0_63501066/article/details/125883017