算法——选择排序&&冒泡排序

48 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,[点击查看活动详情]

两大类

比较类排序

通过比较来决定元素间的相对次序,时间复杂度不能超过O(nlogn),非线性时间比较类排序。
选择排序,冒泡排序,插入排序,希尔排序,归并排序,堆排序,快速排序。

非比较类排序

不通过比较来决定元素间的相对次序,可以突破基于比较排序的时间下界,以线性时间运行。线性时间非排序。
计数排序,桶排序,基数排序。

概念

1,稳定:如果A原本在B前面,而A==B,排序之后A仍在B的前面。
2,不稳定:如果A原本在B前面,而A==B,排序之后A可能会出现在B的后面。
3,时间复杂度:对排序数据的总的操作次数,反映当n变化时,操作次数呈现什么规律。
4,空间复杂度:指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

选择排序

Selection-sort.

排序原理

1,在未排序的序列中找到最大(小)元素,放到排序序列的起始位置。
2,再剩余未排序中继续寻找,放到已排序序列的末尾。
3,以此类推,到所有元素均排序完毕。

特点

时间复杂度为O(n^2)
空间复杂度为S(1):原地进行排序。
是不稳定的。

代码

public class SelectionSort{
    public static void main(String[] args){
        int[] arr={9,1,8,2,7,3,6,4,5};
        selectionSort(arr);
        System.out.println(Arrays.toString(arr));//将数组创建成字符串形式
    
    }
    private static void selectionSort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    swap(arr,i,j);
                }
            }
        }
    }
    
    private static void swap(int[] arr,int i,int j){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}

冒泡排序

Bubble-Sort

排序原理

一次比较两个元素,顺序错误就交换,直到没有再需要交换。

特点

时间复杂度:O(n^2)
空间复杂度为S(1)
是稳定的。

代码

import java.util.Arrays;
public class BubbleSort{
    public static void main(String[] args){
        int[] arr={9,1,8,2,7,3,6,4,5};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    private static void bubbleSort(int[] arr){
        for(int i = 0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-1-i,j++){
                if(arr[i]>arr[j]){
                    swap(arr,j,j+1);
                }
            }
        } 
    }
    private static void swap(int[] arr,int i,int j){
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}