羊蹓狼 发表于 2024-12-24 11:38:25

java 实现排序的几种方式


[*]冒泡排序(Bubble Sort)
   

[*]基本原理:
   

[*]它重复地走访要排序的数列,一次比力两个元素,如果它们的次序错误就把它们互换过来。走访数列的工作是重复地进行直到没有再必要互换,也就是说该数列已经排序完成。
   

[*]示例代码如下:
                                 登录后复制                         public class BubbleSort {
    public static void bubbleSort(int[] arr) {
      int n = arr.length;
      for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (arr > arr) {
                  // 交换元素
                  int temp = arr;
                  arr = arr;
                  arr = temp;
                }
            }
      }
    }
    public static void main(String[] args) {
      int[] arr = {5, 4, 3, 2, 1};
      System.out.println("Before sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
      System.out.println();
      bubbleSort(arr);
      System.out.println("After sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
    }
}      

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
                     

[*]时间复杂度:
   

[*]最好情况(数组已经有序):时间复杂度为,因为只必要进行一次遍历比力,没有互换操纵。
[*]最坏情况(数组完全逆序):时间复杂度为,因为每次遍历都要进行互换操纵,统共必要进行大约次比力。
[*]平均情况:时间复杂度为。
   

[*]空间复杂度:
   

[*]空间复杂度为,因为只必要有限的额外空间来进行元素互换。
   
[*]选择排序(Selection Sort)
   

[*]基本原理:
   

[*]首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末了。以此类推,直到全部元素均排序完毕。
   

[*]示例代码如下:
                                 登录后复制                         public class SelectionSort {
    public static void selectionSort(int[] arr) {
      int n = arr.length;
      for (int i = 0; i < n - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (arr < arr) {
                  minIndex = j;
                }
            }
            // 交换元素
            if (minIndex!= i) {
                int temp = arr;
                arr = arr;
                arr = temp;
            }
      }
    }
    public static void main(String[] args) {
      int[] arr = {5, 4, 3, 2, 1};
      System.out.println("Before sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
      System.out.println();
      selectionSort(arr);
      System.out.println("After sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
    }
}      

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
                     

[*]时间复杂度:
   

[*]最好情况、最坏情况宁静均情况的时间复杂度都是。因为无论数组初始状态怎样,都必要进行次比力操纵来确定元素的位置。
   

[*]空间复杂度:
   

[*]空间复杂度为,因为它只必要有限的额外空间来互换元素。
   
[*]插入排序(Insertion Sort)
   

[*]基本原理:
   

[*]它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常接纳 in - place 排序(即只需用到的额外空间的排序),因而在从后向前扫描过程中,必要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
   

[*]示例代码如下:
                                 登录后复制                         public class InsertionSort {
    public static void insertionSort(int[] arr) {
      int n = arr.length;
      for (int i = 1; i < n; i++) {
            int key = arr;
            int j = i - 1;
            while (j >= 0 && arr > key) {
                arr = arr;
                j = j - 1;
            }
            arr = key;
      }
    }
    public static void main(String[] args) {
      int[] arr = {5, 4, 3, 2, 1};
      System.out.println("Before sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
      System.out.println();
      insertionSort(arr);
      System.out.println("After sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
    }
}      

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
                     

[*]时间复杂度:
   

[*]最好情况(数组已经有序):时间复杂度为,因为只必要进行次比力操纵,没有移动元素的操纵。
[*]最坏情况(数组完全逆序):时间复杂度为,因为每次插入一个元素都必要移动大量元素。
[*]平均情况:时间复杂度为。
   

[*]空间复杂度:
   

[*]空间复杂度为,因为插入排序是一种原地排序算法,只必要有限的额外空间来进行元素的移动和插入。
   
[*]快速排序(Quick Sort)
   

[*]基本原理:
   

[*]它接纳了分治法(Divide - and - Conquer)的策略。从数列中挑出一个元素,称为 “基准”(pivot),重新排序数列,全部元素比基准小的摆放在基准前面,全部元素比基准大的摆放在基准背面(雷同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个过程称为分区(partition)操纵。递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
   

[*]示例代码如下:
                                 登录后复制                         public class QuickSort {
    public static void quickSort(int[] arr, int low, int high) {
      if (low < high) {
            int pivotIndex = partition(arr, low, high);
            quickSort(arr, low, pivotIndex - 1);
            quickSort(arr, pivotIndex + 1, high);
      }
    }
    private static int partition(int[] arr, int low, int high) {
      int pivot = arr;
      int i = low - 1;
      for (int j = low; j < high; j++) {
            if (arr <= pivot) {
                i++;
                // 交换元素
                int temp = arr;
                arr = arr;
                arr = temp;
            }
      }
      // 交换元素
      int temp = arr;
      arr = arr;
      arr = temp;
      return i + 1;
    }
    public static void main(String[] args) {
      int[] arr = {5, 4, 3, 2, 1};
      System.out.println("Before sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
      System.out.println();
      quickSort(arr, 0, arr.length - 1);
      System.out.println("After sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
    }
}      

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]33.
[*]34.
[*]35.
[*]36.
[*]37.
[*]38.
[*]39.
[*]40.
                     

[*]时间复杂度:
   

[*]最好情况:时间复杂度为,当每次分别都能将数组分为两个大小相近的子数组时,递归树的深度为,每层的时间复杂度为。
[*]最坏情况:时间复杂度为,比方数组已经有序,每次分别只能得到一个比上一次分别少一个元素的子数组。
[*]平均情况:时间复杂度为。
   

[*]空间复杂度:
   

[*]最好情况:空间复杂度为,因为递归栈的深度为。
[*]最坏情况:空间复杂度为,比方数组已经有序,递归栈必要存储个元素。
[*]平均情况:空间复杂度为。
   
[*]归并排序(Merge Sort)
   

[*]基本原理:
   

[*]它是创建在归并操纵上的一种有效的排序算法。该算法是接纳分治法(Divide - and - Conquer)的一个非常典型的应用。将已有序的子序列归并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表归并成一个有序表,称为二路归并。
   

[*]示例代码如下:
                                 登录后复制                         public class MergeSort {
    public static void mergeSort(int[] arr) {
      if (arr.length > 1) {
            int mid = arr.length / 2;
            int[] left = new int;
            int[] right;
            if (arr.length % 2 == 0) {
                right = new int;
            } else {
                right = new int;
            }
            for (int i = 0; i < mid; i++) {
                left = arr;
            }
            for (int i = mid; i < arr.length; i++) {
                right = arr;
            }
            mergeSort(left);
            mergeSort(right);
            merge(arr, left, right);
      }
    }
    private static void merge(int[] result, int[] left, int[] right) {
      int i = 0, j = 0, k = 0;
      while (i < left.length && j < right.length) {
            if (left < right) {
                result = left;
                i++;
            } else {
                result = right;
                j++;
            }
            k++;
      }
      while (i < left.length) {
            result = left;
            i++;
            k++;
      }
      while (j < right.length) {
            result = right;
            j++;
            k++;
      }
    }
    public static void main(String[] args) {
      int[] arr = {5, 4, 3, 2, 1};
      System.out.println("Before sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
      System.out.println();
      mergeSort(arr);
      System.out.println("After sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
    }
}      

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]33.
[*]34.
[*]35.
[*]36.
[*]37.
[*]38.
[*]39.
[*]40.
[*]41.
[*]42.
[*]43.
[*]44.
[*]45.
[*]46.
[*]47.
[*]48.
[*]49.
[*]50.
[*]51.
[*]52.
[*]53.
[*]54.
[*]55.
[*]56.
[*]57.
[*]58.
[*]59.
                     

[*]时间复杂度:
   

[*]最好情况、最坏情况宁静均情况的时间复杂度都是。因为归并排序每次分别都将数组分为两个子数组,统共必要分别层,每层归并操纵的时间复杂度为。
   

[*]空间复杂度:
   

[*]空间复杂度为,因为在归并过程中必要创建额外的数组来存储左右子数组。
   
[*]堆排序(Heap Sort)
   

[*]基本原理:
   

[*]堆排序是使用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满意堆积的性子:即子结点的键值或索引总是小于(或者大于)它的父节点。将数组构建成最大堆(对于升序排序),然后每次将堆顶元素(最大值)与堆的最后一个元素互换,再对剩下的堆进行调解,使其重新满意最大堆的性子,重复这个过程直到整个数组排序完成。
   

[*]示例代码如下:
                                 登录后复制                         public class HeapSort {
    public static void heapSort(int[] arr) {
      int n = arr.length;
      // 构建最大堆
      for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
      }
      for (int i = n - 1; i > 0; i--) {
            // 交换堆顶元素和最后一个元素
            int temp = arr;
            arr = arr;
            arr = temp;
            // 调整堆
            heapify(arr, i, 0);
      }
    }
    private static void heapify(int[] arr, int n, int i) {
      int largest = i;
      int l = 2 * i + 1;
      int r = 2 * i + 2;
      if (l < n && arr > arr) {
            largest = l;
      }
      if (r < n && arr > arr) {
            largest = r;
      }
      if (largest!= i) {
            int temp = arr;
            arr = arr;
            arr = temp;
            heapify(arr, n, largest);
      }
    }
    public static void main(String[] args) {
      int[] arr = {5, 4, 3, 2, 1};
      System.out.println("Before sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
      System.out.println();
      heapSort(arr);
      System.out.println("After sorting:");
      for (int num : arr) {
            System.out.print(num + " ");
      }
    }
}      

[*]1.
[*]2.
[*]3.
[*]4.
[*]5.
[*]6.
[*]7.
[*]8.
[*]9.
[*]10.
[*]11.
[*]12.
[*]13.
[*]14.
[*]15.
[*]16.
[*]17.
[*]18.
[*]19.
[*]20.
[*]21.
[*]22.
[*]23.
[*]24.
[*]25.
[*]26.
[*]27.
[*]28.
[*]29.
[*]30.
[*]31.
[*]32.
[*]33.
[*]34.
[*]35.
[*]36.
[*]37.
[*]38.
[*]39.
[*]40.
[*]41.
[*]42.
[*]43.
[*]44.
[*]45.
[*]46.
[*]47.
                     

[*]时间复杂度:
   

[*]最好情况、最坏情况宁静均情况的时间复杂度都是。构建堆的时间复杂度为,每次调解堆的时间复杂度为,统共必要进行次调解。
   

[*]空间复杂度:
   

[*]空间复杂度为,因为堆排序是一种原地排序算法,只必要有限的额外空间来互换元素。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: java 实现排序的几种方式