简单排序【冒泡,选择,插入】java

本文深入讲解了冒泡排序、选择排序及插入排序三种基本排序算法的实现原理与过程,并通过具体示例代码演示了每种排序算法的工作方式。此外,还详细分析了这些算法的时间复杂度,帮助读者理解其效率特性。

冒泡算法(待排序元素较少)

1.原理

比较相邻元素(两两比较),保证最大元素像泡泡一样浮到每轮最上面(也就是最末尾的位置)

在这里插入图片描述

public static void main(String[] args) {
    int[] arr={6,5,4,1,2,3};
    for(int i=arr.length-1;i>0;i--) {
        for(int j=0;j<i;j++) {
            if(arr[j]>arr[j+1]) { //比较
                int t=arr[j];
                arr[j]=arr[j+1];  //交换
                arr[j+1]=t;		  
            }
        }
    }
    System.out.println(Arrays.toString(arr));
}

2.时间复杂度

从最坏情况分析(6,5,4,3,2,1)

求和公式:(首项+末项)×项数/2

比较次数:

​ (N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2

交换次数:

​ (N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2

总次数:

​ (N2/2-N2)+(N2/2-N2)=N^2-N

O(N^2)(大O表示法取最高阶项)


选择排序(待排序元素较少)

1.原理

  • 比较:每次遍历将第一个索引的元素作为最小值(min)的索引,和其他索引值依次比较,若min值大于其他索引值,则将min替换成其他索引值的索引(作为新的最小值位置)
  • 交换:第一个索引处和min处的值
    在这里插入图片描述
public static void main(String[] args) {
    int[] arr={6,5,4,1,2,3};
    //arr.length-2:边界定在这因为arr.length-1是最后一个元素,
    //只有剩余两个元素才需要选择(谁大谁小),剩余一个就直接放那里就可以了
    for(int i=0;i<arr.length-2;i++) {
        int min=i; //最小索引设置为每轮第一个元素索引
        for(int j=i+1;j<arr.length;j++) {
            //比较
            if(arr[j]<arr[min]) {
                min=j; //选出每轮最小的索引
            }
        }
        //交换
        int t=arr[i];
        arr[i]=arr[min];
        arr[min]=t;
    }
    System.out.println(Arrays.toString(arr));
}

2.时间复杂度

从最坏情况分析

求和公式:(首项+末项)×项数/2

比较次数:

​ (N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2

交换次数:

​ (N-1)

总次数:

​ (N2/2-N2)+(N-1))=N^2-N/2-1

O(N^2)(大O表示法取最高阶项)


插入排序(待排序元素较少)

联想成抓扑克牌

1.把所有元素分成两组,已排序和未排序的

2.找到未排序的第一个元素,向已排序的进行插入

3.倒叙遍历(从最后一个往前遍历)已排序的元素,依次和带插入的元素进行比较,直到找到一个元素小于等于待插入元素,将待插入元素放到这个位置,其他元素向后移动一位(也是两两交换只不过是倒序交换)

在这里插入图片描述

public static void main(String[] args) {
    int[] arr={6,5,4,7,1,2,3,7};
    for(int i=1;i<arr.length;i++) { //边界:i=1开始是待排序元素,到最后一个元素结束
        for(int j=i;j>0;j--) { //边界:j=i是待排序元素(倒着排),j>0到这默认第一个位置结束
            //比较 j处小于前一个值
            if(arr[j]<arr[j-1]) { 
                //交换
                int t=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=t;			
            }else {
                break; //j处比前一个元素大就停止 (使得已排元素有序)
            }
        }
    }
    System.out.println(Arrays.toString(arr));
}

从最坏情况分析

求和公式:(首项+末项)×项数/2

比较次数:

​ (N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2

交换次数:

​ (N-1)+(N-2)+…+2+1=[((N-1)+1)*(N-1)]/2=N2/2-N2

总次数:

​ (N2/2-N2)+(N2/2-N2)=N^2-N

O(N^2)(大O表示法取最高阶项)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值