排序算法总结 java

冷不防 2022-09-11 08:26 71阅读 0赞





















































































排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 是否稳定
冒泡排序 O(n2) O(n) O(n2) O(1) 稳定
选择排序 O(n2) O(n2) O(n2) O(1) 不稳定
插入排序 O(n2) O(n) O(n2) O(1) 稳定
希尔排序 O(nlogn) O(nlog2n) O(nlog2n) O(1) 不稳定
归并排序 O(nlogn) O(nlogn) O(ns) O(n) 稳定
快速排序 O(nlogn) O(nlogn) O(n2) O(logn) 不稳定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定
基数排序 O(nk) O(nk) O(n*k) O(n+k) 稳定
桶排序 O(n+k) O(n+k) O(n2) O(n+k) 稳定

冒泡排序

  1. 比较相邻两个元素,如果no.2 < no.1,就交换两个元素。
  2. 对每一对相邻元素进行一样的操作,从第一对一直到结尾的最后一对。
  3. 针对所有元素重复上述步骤,除了最后一个。

    public class MaoPao {

    1. public static void main(String[] args) {
    2. int[] arr = new int[]{
    3. 3,9,-1,10,2};
    4. bubblesort(arr);
    5. System.out.println(Arrays,toString(arr));
    6. }
    7. public static int[] bubblesort(int[] arr) {
    8. if (arr == null || arr.length < 2) return arr;
    9. int n = arr.length;
    10. for (int i = 0; i < n; i++) {
    11. boolean flag = true;
    12. for (int j = 0; j < n-i-1; j++) {
    13. if (arr[j] > arr[j+1]) {
    14. flag = false;
    15. int temp = arr[j];
    16. arr[j] = arr[j+1];
    17. arr[j+1] = temp;
    18. }
    19. }
    20. //flag = true证明数组已经是按顺序排序了,一次交换也没有,可以直接退出循环。
    21. if (flag) {
    22. break;
    23. }
    24. }
    25. return arr;
    26. }

    }

选择排序

  1. 在数组中找到最小的元素, 将它与第一个元素进行交换
  2. 在剩下的元素中找到最小的元素,与第二个元素交换

    public class SelectSort {

    1. public static void main(String[] args) {
    2. int[] arr = new int[]{
    3. 3,0,-9,1,2};
    4. selectsort(arr);
    5. System.out.println(Arrays.toString(arr));
    6. }
    7. public static int[] selectsort(int[] arr) {
    8. int n = arr.length;
    9. for (int i = 0;i < n-1;i++) {
    10. //假设第一个元素是最小的。
    11. int min = i;
    12. for (int j =i+1; j < n; j++) {
    13. if (arr[j] < arr[min]) {
    14. min = j;
    15. }
    16. }
    17. //证明第一个元素不是最小的,交换
    18. if (i != min) {
    19. int temp = arr[min];
    20. arr[min] = arr[i];
    21. arr[i] = temp;
    22. }
    23. }
    24. return arr;
    25. }

    }

插入排序

  1. 将数组看作一个有序表和一个无序表,开始的时候,有序表中只有一个元素,无序表是除了第一个元素剩下的所有元素。
  2. 排序过程中,每次从无序表中抽出第一个元素,与有序表进行比较,插入到合适的位置。

    public class InsertSort {

    1. public static void mian(String[] args) {
    2. insertsort(arr);
    3. System.out.println(Arrays.toString(arr));
    4. }
    5. public static int[] insertsort(int[] arr) {
    6. for (int i = 1; i < arr.length;i++) {
    7. int temp = arr[i];
    8. int j = i-1;
    9. while (j >= 0 && temp < arr[j]) {
    10. //有序表扩大,大的元素放在后面
    11. arr[j+1] = arr[j];
    12. // 向前移,比较有序表之前的元素和当前元素的大小
    13. j--;
    14. }
    15. //此时j=-1,
    16. //或者temp>arr[j]
    17. arr[j+1] = temp;
    18. }
    19. return arr;
    20. }

    }

希尔排序

  1. public class ShellSort {
  2. public static void main(String[] args) {
  3. int[] arr= new int[]{
  4. 8,9,1,7,2,4,5,3,6,0};
  5. shellsort(arr);//交换
  6. shellmove(arr);
  7. System.out.println(Arrays.toString(arr));
  8. }
  9. //这是希尔排序的交换法
  10. public static int[] shellsortexchange(int[] arr) {
  11. for (int gap = arr.length/2 ;gap > 0; gap /=2) {
  12. for (int i = gap; i < arr.length; i++) {
  13. for (int j = i-gap; j >= 0;j -= gap) {
  14. if (arr[j] > arr[j+gap]) {
  15. int temp = arr[j];
  16. arr[j] = arr[j+gap];
  17. arr[j+gap] = temp;
  18. }
  19. }
  20. }
  21. }
  22. return arr;
  23. }
  24. public static int[] shellsortmove(int[] arr) {
  25. for (int gap = arr.length/2; gap > 0; gap /= 2) {
  26. for (int i = gap; i < arr.length; i++) {
  27. int j = i;
  28. int temp = arr[j];
  29. if(arr[j] < arr[j-gap]) {
  30. while (j-gap >= 0 && temp < arr[j-gap]) {
  31. //移动
  32. arr[j] = arr[j-gap];
  33. j -= gap;
  34. }
  35. arr[j] = temp;
  36. }
  37. }
  38. }
  39. return arr;
  40. }
  41. }

归并排序

归并排序是用归并的思想实现的排序方法,该算法采用经典的分治策略,分:将问题分为小的问题递归求解;治:将分的阶段得到的答案修补。
在这里插入图片描述

  1. public static int[] mergosort(int[] arr,int left,int right) {
  2. if (left < right) {
  3. int mid = (left + right) / 2;
  4. arr = mergosort(arr,left,mid);
  5. arr = mergosort(arr,mid+1,right);
  6. mergo(arr,left,mid,right);
  7. }
  8. return arr;
  9. }
  10. public static void mergo(int[] arr,int left, int mid,int right) {
  11. int[] str = new int[right-left+1];
  12. int l = left;
  13. int j = mid+1;
  14. int k = 0;
  15. while (l < j && j <= right){
  16. if (arr[l]< arr[j]) {
  17. str[k] = arr[l];
  18. k++;
  19. l++;
  20. }else {
  21. str[k] = arr[j];
  22. k++;
  23. j++;
  24. }
  25. }
  26. while (l <= mid) {
  27. str[k] = arr[l];
  28. k++;
  29. l++;
  30. }
  31. while (j <= right) {
  32. str[k] = arr[j];
  33. k++;
  34. j++;
  35. }
  36. for (int i = 0;j <k;i++){
  37. arr[left] = str[i];
  38. left++;
  39. }
  40. }
  41. }

快速排序

快速排序:

  1. 选定pivot中心轴(这里的pivot一开始选择是数组第一个元素)
  2. 将大于pivot的数字放在pivot的右边
  3. 将小于pivot的数字放在pivot的左边
  4. 分别左右子序重复前三步操作

    public static void main(String[] args) {

    1. int[] arr = {
    2. -9,78,0,23,-567,70};
    3. quicksort(arr,0,arr.length-1);

    }
    public static void quicksort(int[] arr, int left,int right){

    1. if (left > right) return;
    2. int l = left;
    3. int r = right;
    4. int pivot = arr[l];
    5. while (l < r) {
    6. while (l < r && arr[r] >= pivot){
    7. r--;
    8. }
    9. if (l < r) {
    10. arr[l] = arr[r];
    11. }
    12. while (l < r && arr[l] <= pivot){
    13. l++;
    14. }
    15. if (l < r){
    16. arr[r] = arr[l];
    17. }
    18. if (l >= r){
    19. arr[l] = pivot;
    20. }
    21. }
    22. quicksort(arr,left,r-1);
    23. quicksort(arr,r+1,right);

    }

发表评论

表情:
评论列表 (有 0 条评论,71人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java排序算法总结

     概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们这里说说八

    相关 java排序算法总结

    java 常见的排序算法:冒泡排序,快速排序,选择排序等; 1.冒泡排序:概念--重复的比较要排序的序列,每次比较相邻的两个元素,直到排序完成。        排序步骤如下

    相关 java排序算法总结

    java排序算法总结 排序,这是一个很古老但是又很经典的问题,世界上有很多中优秀排序算法的实现,在这里,我总结了其他比较常用的几种排序算法 1.java排序算法一览