冒泡排序、选择排序、插入排序(详细过程)

    一、冒泡排序   

冒泡排序

        是一种基于比较交换操作的排序算法。 每轮冒泡的过程都是从第一个元素开始,将该元素和相邻下一个元素进行比较交换,使得较大的元素向右移动(如果该元素大于下一个元素,则两个元素交换;如果该元素小于等于下一个元素,则保持不变)。这样一来,每轮冒泡的过程都可以确定一个元素放在正确的位置上,而这个元素就是剩余元素中最大的元素,正确的位置就是剩余位置中的最右侧的位置。这个过程就像是气泡上浮一样,所以叫做冒泡排序。

1、图示

2、代码 
package com.kfm.it.Rank;



public class BubleSort {
    public static void main(String[] args) {
//1.先初始化数组
        int[] a = {45, 5, 4, 67, 54};
//外层循环,它决定一共走几趟

        for (int i = 0; i < a.length - 1; i++) {
//2.交换位置//内层循环,它决定每趟走一次
            for (int j = 0; j < a.length - 1; j++) {
                if (a[j] > a[j + 1]) {
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }

        }
        printArr(a);
    }

    private static void printArr(int[] a) {
        for (int j = 0; j < a.length; j++) {
            System.out.print(a[j] + " ");
        }
        System.out.println();
    }
}
3、复杂度 

时间复杂度:最坏情况:O(N^2)
      最好情况:O(N)
空间复杂度:O(1)


二、选择排序 

基本思想:在未排序的序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

  1. 选择排序的实现步骤:

    • 从第一个元素开始,将其与未排序部分的第一个元素进行比较,如果该元素较小,则将该元素与未排序部分的第一个元素交换位置;
    • 如果该元素较大,则继续向后查找,直到找到一个较小的元素或者到达未排序部分的末尾。
    • 将找到的较小元素与未排序部分的第一个元素交换位置。
    • 重复上述步骤,直到所有元素均排序完毕。
1、图示

2、代码 
package com.kfm.it.Rank;

public class SelectSort {
    public static void main(String[] args) {
        int[] a = {43,56,45,6,457,65,67};


        for (int i = 0; i < a.length - 1; i++) {
//从第二个数开始
            for (int j = i+1; j < a.length; j++) {
                if (a[i] > a[j]) {
                    int temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }

        }
        printArr(a);

    }

    private static void printArr(int[] a) {
        for (int j = 0; j < a.length; j++) {
            System.out.print(a[j] + " ");
        }
        System.out.println();
    }
}
3、复杂度 

选择排序的时间复杂度:O(n^2),其中n为待排序元素的个数。因为每次需要遍历未排序部分的所有元素来找到最小(大)元素。

选择排序的空间复杂度:O(1),只需要常数级别的额外空间用于存储临时变量


三、插入排序 

​ 插入排序和选择排序有一个异曲同工的地方在于他们都存在一个:在原数组上创建子数组的思想,这两种排序方法都会将原数组分为两个部分:待排序数组与已排好序的数组。

1、图示

 2、代码
package com.kfm.it.Rank;

import java.util.Arrays;

public class chaSort {
    public static void main(String[] args) {
        int[] arr = {34, 3, 54, 5, 56, 5, 76, 45, 4, 5};
        for (int i = 1; i < arr.length; i++) {
            for (int j = i - 1;j >= 0;j--) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                } 
        }
        printArr(arr);

    }

    private static void printArr(int[] arr) {
        for (int j = 0; j < arr.length; j++) {
            System.out.print(arr[j] + " ");
        }
        System.out.println();
    }
}
3、复杂度 

时间复杂度:最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序
      最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)

猜你喜欢

转载自blog.csdn.net/pachupingminku/article/details/132163817